事务概述和演示:
一件完整的事情.可以包含多个操作,操作要么成功,要么全部失败mysql中的事务:
默认是事务自动提交手动提交:
1.关闭自动提交
2.手动开启一个事务
start transaction;
commit;
rollback;
java中的事务:
Connection接口的apisetAutoCommit(false):手动的开启一个事务
commit():提交
rollback():回滚
DBUitls使用事务:
1.创建QueryRunnernew QueryRunner():手动事务 调用他的方法的时候必须手动传入一个连接,连接得手动关闭,事务得手动控制.
new QueryRunner(DataSource ds):自动事务 调用他的方法的时候不需要传入一个连接,连接自动关闭,事务自动控制.
2.使用的方法 (手动事务)
query(Conection con .....)
update(Connection con .....)
![![DBUtils在使用事务][1]](http://suyibkftp.oss-cn-qingdao.aliyuncs.com/%E5%8D%9A%E5%AE%A2%E6%96%87%E7%AB%A0%E5%9B%BE/%E4%BA%8B%E5%8A%A1/%E5%B7%A5%E5%85%B7%E7%B1%BBDBUtils%E5%BC%80%E5%90%AF%E4%BA%8B%E5%8A%A1%E7%9A%84%E4%BD%BF%E7%94%A8.png)
事务中要想保证在一个事务中,必须保证使用同一个Connection连接(在中项目解决方式)
方式1:向下传递连接(将链接对象作为参数传递给dao层)![![JDBCUtils&向下传递][2]](http://suyibkftp.oss-cn-qingdao.aliyuncs.com/%E5%8D%9A%E5%AE%A2%E6%96%87%E7%AB%A0%E5%9B%BE/%E4%BA%8B%E5%8A%A1/JDBCUtils%26%E5%90%91%E4%B8%8B%E4%BC%A0%E9%80%92.png)
方式2:将连接和当前线程绑定
ThreadLocal
常用的方法:
set(Object value)
Object get()
remove()
![![自定义工具类创建链接对象&和线程绑定][3]](http://suyibkftp.oss-cn-qingdao.aliyuncs.com/%E5%8D%9A%E5%AE%A2%E6%96%87%E7%AB%A0%E5%9B%BE/%E4%BA%8B%E5%8A%A1/DataSourceUtils.png)
![![调用工具类][4]](http://suyibkftp.oss-cn-qingdao.aliyuncs.com/%E5%8D%9A%E5%AE%A2%E6%96%87%E7%AB%A0%E5%9B%BE/%E4%BA%8B%E5%8A%A1/%E7%BB%91%E5%AE%9A%E7%BA%BF%E7%A8%8B.png)
事务的特性:
ACID
- 原子性 -- 事务不可分割.- 一致性 -- 事务执行的前后数据的完整性保持一致.
- 隔离性 -- 一个事务执行的过程中,不应该受到其他的事务的干扰.
- 持久性 -- 事务一旦提交,数据就永久保持到数据库中.
若不考虑隔离性的时候会发生的问题
- 脏读 - 一个事务读到了另一个事务未提交的数据.- 不可重复读 - 一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致.
- 虚读 - 一个事务读到了另一个事务已经提交的insert数据,导致多次查询结构不一致.
设置隔离级别
通过设置隔离级别可以解决上面的问题- read uncommitted:读未提交 什么问题都避免不了
- read committed:读已提交 避免脏读
- repeatable read:可重复读 避免脏读和不可重复读
- serializable:串行化 避免所有的问题 锁表
安全:
serializable>repeatable read>read committed>read uncommitted
效率
serializable<repeatable read<read committed<read uncommitted
mysql中默认隔离级别 repeatable read
oracle中默认隔离级别 read committed