事务ACID如何定义,事务隔离性解决的问题

时间:2024-10-28 11:07:44

挚享科技 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 :  全部解决

相关文章