事务概述和演示:
一件完整的事情.可以包含多个操作,操作要么成功,要么全部失败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 .....)
事务中要想保证在一个事务中,必须保证使用同一个Connection连接(在中项目解决方式)
方式1:向下传递连接(将链接对象作为参数传递给dao层)方式2:将连接和当前线程绑定
ThreadLocal
常用的方法:
set(Object value)
Object get()
remove()
事务的特性:
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