事务
ransaction 其实指的一组操作,里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功,那么都算失败。 所有的数据都回归到最初的状态(回滚),事务是用来确保逻辑成功。
- 代码逻辑:
1. 通过conn.setAutoCommit(false )来关闭自动提交的设置;
2. 提交事务 conn.commit();
3. 回滚事务 conn.rollback();
事务特性
- 原子性
指的是 事务中包含的逻辑,不可分割。
- 一致性
指的是 事务执行前后。数据完整保持一致。
- 隔离性
指的是 事务在执行期间不应该受到其他事务的影响
- 持久性
指的是 事务执行成功,那么数据应该持久保存到磁盘上。
事务安全隐患
- 读
1.脏读 :(读未提交)
个事务读到另外一个事务还未提交的数据
2.不可重复读(读已提交)
个事务读到了另外一个事务提交前 和提交后的数据 ,造成了前后两次查询结果不一致。
3.幻读
A事务中,读取表tab的数据有1000行,接着操作其他表,而在操作其他表的过程中,另一个事务B对表tab删除(或增加)了100行数据,此时A事务有需要又重新查看一次表tab,而这时表tab却只有900行数据,跟刚才读到的1000行不一致了!哪一个才是正确的?这就像幻像一样称为幻读。
- 写
1.丢失更新
- .两个事务先后开启,事务一修改数据后提交,事务二再修改数据,提交,造成事务一的数据修改无效。
- .两个事务先后开启,事务一修改数据后提交,事务二再修改数据,回滚,造成事务一数据无效。
隔离级别
-
读未提交
引发问题: 脏读 -
读已提交
解决: 脏读 , 引发: 不可重复读。 -
可重复读(不管另一个事务提没提交都是原始数v据。)
解决: 脏读 、 不可重复读 , 未解决: 幻读
mySql 默认的隔离级别是 可重复读
Oracle 默认的隔离级别是 读已提交
- 悲观锁
查询的时候,加入 for update
- 乐观锁
自己控制加字段。