挚享科技 2018.4.8
事务的四个特性:
1. 原子性: 同一个事务的多个操作,要么都成功,要么全部失败回滚。
2. 一致性: 事务必须确保数据库从一个一致性状态变换为另一个一致性状态。 其实就是操作完成后数据库仍然满足完整性约束。比如ab 工500,转账后合计应该还是500.
3. 隔离性 : 多个事务并发执行时,一个事务的执行不影响其他事务的执行。
4. 持久性: 事务提交完成后数据得到固化,对数据库的修改永久保存了。
不考虑事务隔离性会导致的问题
我们以X表的 count 为例子
1. 第一类丢失更新: 也叫回滚丢失: 假设两个事务都去更新count,读取到count 都是100, A事务成功,更新count到101 ,但是B事务更新失败回滚count到100.导致A事务的更新丢失了
2. 脏读 : 事务B读取了事务A修改但未正式提交的更新。 事务更新count 到101 ,但未提交。此时事务B读取count为101 ,然后加1 变为102,提交成功。但是A 由于某种原因回滚了。就导致count 变成102 。
3. 不可重复读 : 同一个事务里对count 做多次查询结果不一致。 事务A 第一次读count 是100, 此时事务B更新提交了count 到101 。。事务A又读了一次count .两次读取结果不一致。
4. 第二类丢失更新: 又叫覆盖丢失。 事务A,B 都读到count 是100,然后都去更新,结果是101. 实际应该是102 ,造成有一个事务的更新被覆盖丢失了。
5. 幻读 :和不可重复读类似(不可重复读重点在update e , 幻读重点在insert和 delete)。只是不是针对数据的值而是针对的数据的条数,就是一个事务两次查询 X 表的数据条数不一致。。
三种隔离级别
Read Commited : 解决1,2 。。 一个事务只能看到已经提交的更新,看不到未提交的更新。。
Repeatable Read : 解决 1,2,3,4, 只要存在读该行数据,就禁止写。。
Serializable : 全部解决