天天看点

第77节:Java中的事务和数据库连接池和DBUtiles

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

看哭你,字数:8803,承蒙关照,谢谢朋友点赞!

第77节:Java中的事务和数据库连接池和DBUtiles

<code>Transaction</code>事务,什么是事务,事务是包含一组操作,这组操作里面包含许多个单一的逻辑,只要有一个逻辑没有执行成功就算失败,导致回滚就是指所有的数据都会回到最初的状态.

有事务,是为了保证逻辑一定要成功,如银行转账.

什么是<code>jsp</code>,<code>jsp</code>的三大指令.

三大动作标签:

九大内置对象:

取值

<code>EL</code>的11个隐式对象:

导包哦,引入标签库是1.1的:

第77节:Java中的事务和数据库连接池和DBUtiles

数据库命令行:

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

关闭自动提交.

关闭了提交,再减100:

第77节:Java中的事务和数据库连接池和DBUtiles

会到数据库查看:

第77节:Java中的事务和数据库连接池和DBUtiles

值没改变!

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

添加改变代码:

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

事务只针对连接.

事务

记住:

什么是事务,事务有什么用处,事务怎么用.

事务的特点:

原子性: 指的是事务中包含的逻辑,不可以分割(事务中逻辑不可分)

一致性: 事务执行前和执行后,保持数据的完整性一致(执行前后,数据保持一致)

隔离性: 事务在执行期间不受到其他事务的影响(隔离不受影响)

持久性: 事务执行结束,提交或回滚,数据都应该持久化到数据中(数据持久化在数据中)

安全问题

读问题

脏读,不可重复读,幻读

写问题

丢失更新,解决丢失更新的方法,一悲观锁和乐观锁

隔离级别

第77节:Java中的事务和数据库连接池和DBUtiles

脏读:

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

一条连接:

第77节:Java中的事务和数据库连接池和DBUtiles

另一条连接:

第77节:Java中的事务和数据库连接池和DBUtiles

读未提交

第77节:Java中的事务和数据库连接池和DBUtiles
例子
第77节:Java中的事务和数据库连接池和DBUtiles

这里查询,然后再看看数据库中的表:

第77节:Java中的事务和数据库连接池和DBUtiles

命令提交:

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
不可重复读的问题
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
读未提交,引发脏读,读已提交解决脏读,引发不可重复读, 可重复读解决脏读解决了脏读,不可重复读,

asss

读:

脏读 不可重读读 幻读

一个事务读到另外一个事务还未提交的数据

不可重复读:

一个事务读到另外一个事务提交的数据,导致前后两次查询结果不一致

幻读:

一个事务读到了另外一个事务已提交的插入的数据,导致多次查询结果不一致.

读未提交,

会导致丢失更新

读已提交,

能够屏蔽 脏读的现象,但是引发不可重复读

隔离级别:

<code>mysql</code>默认的是重复读.

设置A窗口的隔离级别为 读未提交

第77节:Java中的事务和数据库连接池和DBUtiles

两个窗口都分别开启事务

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

读未提交是一个事务可以读取到另一个事务还没有提交的数据,会引发脏读现象,读取到的是数据库内存中的数据,并不是真正的磁盘上的数据.

还未提交时,数据库内存中的数据是不会改变的,只有到commit提交后,数据库中的数据才会提交,从而读取真正在磁盘上的数据.

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

在a发生了变化,屏蔽了脏读,引发不可重复读,读已提交.读已提交,在a窗口设置的是读已提交,两边开启事务.在b窗口更新操作.

在a窗口查询结果不一致,一次是在b窗口提交事务之前,一次的提交之后.

第77节:Java中的事务和数据库连接池和DBUtiles

引发了不可重复读

不可重复读,一个事务读取到了另一个事务提交的数据,导致前后两次查询结果不一致.

会造成问题是前后读取到的结果不一样,发生了不可重复读,就是不可以 重复读取, 就是不能执行多次读取, 否则会导致结果不一致, 这下好了, 读取已提交导致了 重复读取, 结果还不一致, 就出现了叫 不可重复读 现象.

<code>Repeatable Read</code>重复读, 重复读就是mysql默认的隔离级别,可以让食物在自己的会话中重复读取数据,并且不会出现结果不一致的现象, 就算其他事务提交了, 也还是会在窗口中出现以前的数据, 这就是可重复读了.

重复读, 就是让它可以重复查询, 结果还是和以前一样的效果出现.

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

幻读:什么是幻读呢?

就是一个事务读到另一个事务已提交的插入的数据,会导致多次查询结果不一致.就是幻读,是不是幻读理解为我幻想了, 事务已提交的插入数据, 导致幻想了,(幻读) 导致每次查询结果不一样.

事务已提交,多次查询结果不一致.

幻读-&gt;<code>Serializable</code>可串行化

该事务的级别是最高的事务级别,我是可串行化,是最高的.可以解决如下小弟的问题,如脏读,不可重复读,幻读,因为我是可串行化,是大佬,但作为大佬,还是会有缺点的.

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

是的,a提交才动.现在我们让b先开启事务.

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

可串行化, 谁先打开事务,就谁有权利,这个隔离级别,先打开就有权利让别人等着,等先打开事务的那个家伙,提交或者回滚后,才能进行,这种级别是用得比较少的,因为容易导致性能上效率低下.

隔离级别有四个哦

读已提交

可重复读

可串行化

如果按照效率划分,从高到低,排个名次如下:

读未提交 -&gt; 脏读

读已提交 -&gt; 不可重复读

可重复读 -&gt; 解决重复读

可串行化 -&gt; 以上都是我小弟来着

按照拦截程度来划分,从高到底,排名如下:

可串行化 -&gt; 我是大哥

可重复读 -&gt; 我是二哥

读已提交 -&gt; 我是三弟

读未提交 -&gt; 我是小弟

事务只是针对连接对象.事务是会自动提交的.

安全隐患和隔离级别

安全隐患: 读的安全隐患和写的安全隐患

脏读,读到未提交的数据,一个事务读到了另一个事务未提交的数据;

不可重复读,就是一个事务读到了另一个事务已经提交的数据,导致前后两次查询的结果不一致;

幻读,就是一个事务读到了另一个事务添加的数据,导致前后查询结果不一致.

写: 丢失更新…

读未提交,导致脏读

读已提交,解决脏读,导致不可重复读

可重复读,解决脏读和不可重复读,导致幻读

可串行化,解决脏读,不可重复读,幻读

默认的mysql是可重复读,oracle默认是读已提交

丢失更新

乐观锁

悲观锁

安全问题包含 读的问题和写的问题

事务的特性是什么? 原子性,一致性,隔离性,持久性
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

b窗口没有提交.等待提交中:

案例控制面板,我的a:

第77节:Java中的事务和数据库连接池和DBUtiles

哭了,这是设置默认的重复读啊!

听说丢失更新

a事务和b事务同时查询一个表,a开始修改并提交<code>name</code>字段的名字,然后b事务开始修改该行的<code>money</code>的字段,如果b事务提交,那么之前a事务修改的名字没有了,变回去了哦,当然b事务回滚,也同样导致a事务更新没有了哦.回滚也会把之前b事务的最初的数据还原.

这里的情况处理序列化级别外,就是可串行化级别大佬哦!

解决丢失更新的方法

悲观锁的态度,它是悲观的态度,它是一定会丢失更新,它的想法是我一定会出错.

而乐观锁,它的态度是我一定不会丢失更新.

数据库的锁机制,排他锁

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
丢失更新的问题

不考虑隔离性,产生写入数据导致的问题为丢失更新的问题,两个事务同时对某一条记录做修改,然后会导致丢失更新的问题.

a,b两个事务同时获取一条数据,同时做了修改,a事务修改后,提交了事务,b事务修改后,不管是提交还是回滚,都会对数据发生影响.

悲观锁记住用了这句:

a事务先提交,数据库版本<code>version</code>变为1,b事务在提交的时候,比对数据库<code>version</code>和自己的<code>version</code>是不一样的,不允许提交,要先更新.

a提交的时候版本变为1,b提交的时候,发现版本不一致就无法提交,要进行更新后提交.

什么是连接池,连接池的作用是什么,自定义连接池,开源的连接池?

那么什么是数据库连接池?

数据库连接池是Java程序和数据连接的中介媒介,以前一个Java程序对应一个连接,然后就可以连接到数据了,可以一旦多了呢?

就有人发明了数据库连接池,可以一下连接多个,但是是有限制的,一旦多了,就会扩容,额外增加3到5个,不会增幅太大,也有最大值的限制.

数据库的连接对象 创建工作 比较消耗性能 一开始在内存中会开辟一块空间, 用于是 这个数据库连接池的空间, 可以在池子里放置很多个连接对象, 数据库连接池里有很多个连接对象, 后面需要连接的话会直接从池子里面去, 就不用自己去创建连接了, 因为数据库的连接对象创建工作是比较耗时的, 使用完, 数据库连接池中的 连接对象 ,是要进行归还的, 确保连接对象可以循环连接使用.
创建数据库的连接池
第77节:Java中的事务和数据库连接池和DBUtiles
自定义数据库连接池

解决自定义数据库连接池问题

因为多了一个<code>addBack</code>方法,要记住这个方法,且不能用面向接口编程.修改<code>close</code>方法,改成不是关闭而是归还连接对象.

如何扩展方法

装饰者模式

装饰者模式:

分析
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
数据库连接池_DBCP

DBCP开源连接池

C3P0,什么是C3P0,怎么用

DBCP为数据库连接池,是java数据库连接池的一种是Apache开发的,通过数据库连接池可以让程序自动管理数据库的连接.

C3P0也是一种开源的连接池,实现了数据库和JNDI绑定,使用它的开源项目:

怎么用DBCP

导入jar包

DBCP连接数据库使用

以上是不使用配置文件的情况.

DBCP使用配置文件方式
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
不使用配置方式
第77节:Java中的事务和数据库连接池和DBUtiles
C3P0使用配置文件的方式
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

<code>c3p0-config.xml file</code>:

第77节:Java中的事务和数据库连接池和DBUtiles

可以弄oracle:

<code>oracle</code>:

什么是DBUtils呢?怎么用呢?

优化数据库连接,使用C3P0:

DBUtils优化增删改查方法

导包,两行代码交你增删改查,6666!

两行.

第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles
查询
第77节:Java中的事务和数据库连接池和DBUtiles
查询优化
第77节:Java中的事务和数据库连接池和DBUtiles

一个对象: BeanHandler

一个集合里面有很多对象: BeanListHandler

优化成两行代码:

第77节:Java中的事务和数据库连接池和DBUtiles
查询多个数据
第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles

实现类:

第77节:Java中的事务和数据库连接池和DBUtiles
事务,连接池,DBUtils

查询:

第77节:Java中的事务和数据库连接池和DBUtiles

脏读

不可重复读

幻读

丢失更新 写的问题

悲观锁 for update

乐观锁 ,添加字段版本级别

4个隔离级别

读未提交,引发脏读

读已提交,引发不可重复读,解决了脏读

可重复读,引发了幻读,解决了脏读,不可重复读

可串行化(序列化),解决了脏读,不可重复读,幻读,引发效率低下问题

数据库连接池

BCP -&gt; 不使用配置 使用配置

C3P0 -&gt; 不使用配置 使用配置

自定义连接池 -&gt; 饰者模式

可在评论发表你的总结内容,做功课哦!

如果看了觉得不错

点赞!转发!

达叔小生:往后余生,唯独有你 You and me, we are family ! 90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通 简书博客: 达叔小生 https://www.jianshu.com/u/c785ece603d1

下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注

小礼物走一走 or 点赞

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!