![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMiVWNxcDNlZzM1YTOmlDNkJ2NjRzN0QzMkBjY2ADNz8CXxAzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.png)
第77节:Java中的事务和数据库连接池和DBUtiles
看哭你,字数:8803,承蒙关照,谢谢朋友点赞!
<code>Transaction</code>事务,什么是事务,事务是包含一组操作,这组操作里面包含许多个单一的逻辑,只要有一个逻辑没有执行成功就算失败,导致回滚就是指所有的数据都会回到最初的状态.
有事务,是为了保证逻辑一定要成功,如银行转账.
什么是<code>jsp</code>,<code>jsp</code>的三大指令.
三大动作标签:
九大内置对象:
取值
<code>EL</code>的11个隐式对象:
导包哦,引入标签库是1.1的:
数据库命令行:
关闭自动提交.
关闭了提交,再减100:
会到数据库查看:
值没改变!
添加改变代码:
事务只针对连接.
事务
记住:
什么是事务,事务有什么用处,事务怎么用.
事务的特点:
原子性: 指的是事务中包含的逻辑,不可以分割(事务中逻辑不可分)
一致性: 事务执行前和执行后,保持数据的完整性一致(执行前后,数据保持一致)
隔离性: 事务在执行期间不受到其他事务的影响(隔离不受影响)
持久性: 事务执行结束,提交或回滚,数据都应该持久化到数据中(数据持久化在数据中)
安全问题
读问题
脏读,不可重复读,幻读
写问题
丢失更新,解决丢失更新的方法,一悲观锁和乐观锁
隔离级别
脏读:
一条连接:
另一条连接:
读未提交
例子
这里查询,然后再看看数据库中的表:
命令提交:
不可重复读的问题
读未提交,引发脏读,读已提交解决脏读,引发不可重复读, 可重复读解决脏读解决了脏读,不可重复读,
asss
读:
脏读 不可重读读 幻读
一个事务读到另外一个事务还未提交的数据
不可重复读:
一个事务读到另外一个事务提交的数据,导致前后两次查询结果不一致
幻读:
一个事务读到了另外一个事务已提交的插入的数据,导致多次查询结果不一致.
读未提交,
会导致丢失更新
读已提交,
能够屏蔽 脏读的现象,但是引发不可重复读
隔离级别:
<code>mysql</code>默认的是重复读.
设置A窗口的隔离级别为 读未提交
两个窗口都分别开启事务
读未提交是一个事务可以读取到另一个事务还没有提交的数据,会引发脏读现象,读取到的是数据库内存中的数据,并不是真正的磁盘上的数据.
还未提交时,数据库内存中的数据是不会改变的,只有到commit提交后,数据库中的数据才会提交,从而读取真正在磁盘上的数据.
在a发生了变化,屏蔽了脏读,引发不可重复读,读已提交.读已提交,在a窗口设置的是读已提交,两边开启事务.在b窗口更新操作.
在a窗口查询结果不一致,一次是在b窗口提交事务之前,一次的提交之后.
引发了不可重复读
不可重复读,一个事务读取到了另一个事务提交的数据,导致前后两次查询结果不一致.
会造成问题是前后读取到的结果不一样,发生了不可重复读,就是不可以 重复读取, 就是不能执行多次读取, 否则会导致结果不一致, 这下好了, 读取已提交导致了 重复读取, 结果还不一致, 就出现了叫 不可重复读 现象.
<code>Repeatable Read</code>重复读, 重复读就是mysql默认的隔离级别,可以让食物在自己的会话中重复读取数据,并且不会出现结果不一致的现象, 就算其他事务提交了, 也还是会在窗口中出现以前的数据, 这就是可重复读了.
重复读, 就是让它可以重复查询, 结果还是和以前一样的效果出现.
幻读:什么是幻读呢?
就是一个事务读到另一个事务已提交的插入的数据,会导致多次查询结果不一致.就是幻读,是不是幻读理解为我幻想了, 事务已提交的插入数据, 导致幻想了,(幻读) 导致每次查询结果不一样.
事务已提交,多次查询结果不一致.
幻读-><code>Serializable</code>可串行化
该事务的级别是最高的事务级别,我是可串行化,是最高的.可以解决如下小弟的问题,如脏读,不可重复读,幻读,因为我是可串行化,是大佬,但作为大佬,还是会有缺点的.
是的,a提交才动.现在我们让b先开启事务.
可串行化, 谁先打开事务,就谁有权利,这个隔离级别,先打开就有权利让别人等着,等先打开事务的那个家伙,提交或者回滚后,才能进行,这种级别是用得比较少的,因为容易导致性能上效率低下.
隔离级别有四个哦
读已提交
可重复读
可串行化
如果按照效率划分,从高到低,排个名次如下:
读未提交 -> 脏读
读已提交 -> 不可重复读
可重复读 -> 解决重复读
可串行化 -> 以上都是我小弟来着
按照拦截程度来划分,从高到底,排名如下:
可串行化 -> 我是大哥
可重复读 -> 我是二哥
读已提交 -> 我是三弟
读未提交 -> 我是小弟
事务只是针对连接对象.事务是会自动提交的.
安全隐患和隔离级别
安全隐患: 读的安全隐患和写的安全隐患
脏读,读到未提交的数据,一个事务读到了另一个事务未提交的数据;
不可重复读,就是一个事务读到了另一个事务已经提交的数据,导致前后两次查询的结果不一致;
幻读,就是一个事务读到了另一个事务添加的数据,导致前后查询结果不一致.
写: 丢失更新…
读未提交,导致脏读
读已提交,解决脏读,导致不可重复读
可重复读,解决脏读和不可重复读,导致幻读
可串行化,解决脏读,不可重复读,幻读
默认的mysql是可重复读,oracle默认是读已提交
丢失更新
乐观锁
悲观锁
安全问题包含 读的问题和写的问题
事务的特性是什么? 原子性,一致性,隔离性,持久性
b窗口没有提交.等待提交中:
案例控制面板,我的a:
哭了,这是设置默认的重复读啊!
听说丢失更新
a事务和b事务同时查询一个表,a开始修改并提交<code>name</code>字段的名字,然后b事务开始修改该行的<code>money</code>的字段,如果b事务提交,那么之前a事务修改的名字没有了,变回去了哦,当然b事务回滚,也同样导致a事务更新没有了哦.回滚也会把之前b事务的最初的数据还原.
这里的情况处理序列化级别外,就是可串行化级别大佬哦!
解决丢失更新的方法
悲观锁的态度,它是悲观的态度,它是一定会丢失更新,它的想法是我一定会出错.
而乐观锁,它的态度是我一定不会丢失更新.
数据库的锁机制,排他锁
丢失更新的问题
不考虑隔离性,产生写入数据导致的问题为丢失更新的问题,两个事务同时对某一条记录做修改,然后会导致丢失更新的问题.
a,b两个事务同时获取一条数据,同时做了修改,a事务修改后,提交了事务,b事务修改后,不管是提交还是回滚,都会对数据发生影响.
悲观锁记住用了这句:
a事务先提交,数据库版本<code>version</code>变为1,b事务在提交的时候,比对数据库<code>version</code>和自己的<code>version</code>是不一样的,不允许提交,要先更新.
a提交的时候版本变为1,b提交的时候,发现版本不一致就无法提交,要进行更新后提交.
什么是连接池,连接池的作用是什么,自定义连接池,开源的连接池?
那么什么是数据库连接池?
数据库连接池是Java程序和数据连接的中介媒介,以前一个Java程序对应一个连接,然后就可以连接到数据了,可以一旦多了呢?
就有人发明了数据库连接池,可以一下连接多个,但是是有限制的,一旦多了,就会扩容,额外增加3到5个,不会增幅太大,也有最大值的限制.
数据库的连接对象 创建工作 比较消耗性能 一开始在内存中会开辟一块空间, 用于是 这个数据库连接池的空间, 可以在池子里放置很多个连接对象, 数据库连接池里有很多个连接对象, 后面需要连接的话会直接从池子里面去, 就不用自己去创建连接了, 因为数据库的连接对象创建工作是比较耗时的, 使用完, 数据库连接池中的 连接对象 ,是要进行归还的, 确保连接对象可以循环连接使用.
创建数据库的连接池
自定义数据库连接池
解决自定义数据库连接池问题
因为多了一个<code>addBack</code>方法,要记住这个方法,且不能用面向接口编程.修改<code>close</code>方法,改成不是关闭而是归还连接对象.
如何扩展方法
装饰者模式
装饰者模式:
分析
数据库连接池_DBCP
DBCP开源连接池
C3P0,什么是C3P0,怎么用
DBCP为数据库连接池,是java数据库连接池的一种是Apache开发的,通过数据库连接池可以让程序自动管理数据库的连接.
C3P0也是一种开源的连接池,实现了数据库和JNDI绑定,使用它的开源项目:
怎么用DBCP
导入jar包
DBCP连接数据库使用
以上是不使用配置文件的情况.
DBCP使用配置文件方式
不使用配置方式
C3P0使用配置文件的方式
<code>c3p0-config.xml file</code>:
可以弄oracle:
<code>oracle</code>:
什么是DBUtils呢?怎么用呢?
优化数据库连接,使用C3P0:
DBUtils优化增删改查方法
导包,两行代码交你增删改查,6666!
两行.
查询
查询优化
一个对象: BeanHandler
一个集合里面有很多对象: BeanListHandler
优化成两行代码:
查询多个数据
实现类:
事务,连接池,DBUtils
查询:
脏读
不可重复读
幻读
丢失更新 写的问题
悲观锁 for update
乐观锁 ,添加字段版本级别
4个隔离级别
读未提交,引发脏读
读已提交,引发不可重复读,解决了脏读
可重复读,引发了幻读,解决了脏读,不可重复读
可串行化(序列化),解决了脏读,不可重复读,幻读,引发效率低下问题
数据库连接池
BCP -> 不使用配置 使用配置
C3P0 -> 不使用配置 使用配置
自定义连接池 -> 饰者模式
可在评论发表你的总结内容,做功课哦!
如果看了觉得不错
点赞!转发!
达叔小生:往后余生,唯独有你 You and me, we are family ! 90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通 简书博客: 达叔小生 https://www.jianshu.com/u/c785ece603d1
下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
小礼物走一走 or 点赞
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!