- 一 事务ACID特性与隔离级别
- 1. ACID
- 2. 隔离级别
- 2.1 产生问题
- 2.1.1 丢失更新
- 2.1.2 脏读
- 2.1.3 不可重复读
- 2.1.4 幻读
- 3. 四种隔离级别
- 3.1 幻读与不可重复读的区别
- 3.2 不可重复读和脏读的区别
- 3.3 查看隔离级别
- 3.4 设置隔离级别
-
原子性(atomicity)
是指一个事务必须是一个不可分割的最小工作单元,在整个事务所有 *** 作中要么全部成功,要么失败回滚,对于一个事务来说,不可能只执行其中的部分 *** 作成功。
-
一致性(consistency)
是指一个事务执行之前和执行之后都必须处于一致性状态。比如a账号与b账号共有100块,这两个账号之间转账,不管成功还是失败,这两个账号总和还是100
-
隔离性(isolation)
一般是指一个事务修改在提交之前,对其他事务是不可见的。与隔离级别有关。
-
持久性(durability)
是指事务一旦被提交,所做的 *** 作就会永久保存到数据库中,系统遭遇故障也不会丢失提交的事务 *** 作
2.1 产生问题 2.1.1 丢失更新
当两个或者多个事务选择同一行,按最初的值进行更新,由于每个事务互相不知道对方的存在。假设事务a修改事务之前,事务b已经修改过一次;那么事务a会覆盖掉其他事务所做的更新,就会发生丢失更新问题。
解决方案:
- 悲观锁: 更新数据加上排它锁。执行最后一步加锁查询数据是否改变,若没改变,则进行更新,否则失败。
- 乐观锁:使用版本控制实现
一个事务读取了另一个事务未提交的数据。
解决方案:
- 事务隔离级别调整到read committed
是指一个事务内多次读同一个数据,另外一个事务也访问并修改同一数据;当再次读取数据时,发现读取的数据已经发生了改变、或某些记录已经被删除了,这种现象就叫做不可重复读。
解决方案:
- 隔离级别调整到 Repeatable read
一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据(或者删除该条数据),这种现象就称为幻读
解决方案:
- Repeatable read及以上级别,通过间隙锁防止幻读的出现。
-
read uncommitted(读未提交):所有事务都可以看到其他未提交事务的执行结果。
-
read committed(读已提交):一个事务只能看到已经提交事务所做的改变,可以避免脏读的发生。
-
repeatable read(可重复读): InnoDB默认隔离级别,确保同一个事务的多个实例在并发读取数据时,会看到同样的数据行,解决了不可重复读的问题。
-
serializable(串行):通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。
-
读数据一致性 脏读 不可重复读 幻读 read uncommitted最低级别,不读取损害的数据☑️☑️☑️ read committed语句级☑️☑️ repeatable read事务级☑️ serializable最高级,事务级
-
不可重复读(修改):在同一个事务中,同样的条件,第一次读的数据和第二次读的数据不一致。(有其他事务提交了修改)
-
幻读(新增或者删除):在同一个事务中,同样的条件,第一次和第二次读出来的记录数量不一样。(有其他事务插入或者删除了数据)
- 脏读读到未提交的数据
- 不可重复读读到是
mysql> select @@transaction_isolation; +-------------------------+ | @@transaction_isolation | +-------------------------+ | REPEATABLE-READ | +-------------------------+ 1 row in set (0.00 sec)3.4 设置隔离级别
set session transaction isolation level read uncommitted;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)