mysql过过水-------事务与隔离级别

mysql过过水-------事务与隔离级别,第1张

mysql过过水-------事务隔离级别

文章目录
      • 一 事务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 设置隔离级别

一 事务ACID特性与隔离级别 1. ACID
  • 原子性(atomicity)

    ​ 是指一个事务必须是一个不可分割的最小工作单元,在整个事务所有 *** 作中要么全部成功,要么失败回滚,对于一个事务来说,不可能只执行其中的部分 *** 作成功。

  • 一致性(consistency)

    ​ 是指一个事务执行之前和执行之后都必须处于一致性状态。比如a账号与b账号共有100块,这两个账号之间转账,不管成功还是失败,这两个账号总和还是100

  • 隔离性(isolation)

    ​ 一般是指一个事务修改在提交之前,对其他事务是不可见的。与隔离级别有关。

  • 持久性(durability)

    ​ 是指事务一旦被提交,所做的 *** 作就会永久保存到数据库中,系统遭遇故障也不会丢失提交的事务 *** 作

2. 隔离级别
2.1 产生问题 2.1.1 丢失更新

​ 当两个或者多个事务选择同一行,按最初的值进行更新,由于每个事务互相不知道对方的存在。假设事务a修改事务之前,事务b已经修改过一次;那么事务a会覆盖掉其他事务所做的更新,就会发生丢失更新问题。

时间事务a事务bT1beginbeginT2100100T3-10T4commitT5+20T6commitT7120

解决方案:

  • 悲观锁: 更新数据加上排它锁。执行最后一步加锁查询数据是否改变,若没改变,则进行更新,否则失败。
  • 乐观锁:使用版本控制实现
2.1.2 脏读

​ 一个事务读取了另一个事务未提交的数据。

时间事务a事务bT1beginbeginT2100100T3update 110T4select 110T5rollback

解决方案:

  • 事务隔离级别调整到read committed
2.1.3 不可重复读

​ 是指一个事务内多次读同一个数据,另外一个事务也访问并修改同一数据;当再次读取数据时,发现读取的数据已经发生了改变、或某些记录已经被删除了,这种现象就叫做不可重复读。

时间事务a事务bT1beginbeginT2100100T3update 110T4commitT5110T6commit

解决方案:

  • 隔离级别调整到 Repeatable read
2.1.4 幻读

​ 一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据(或者删除该条数据),这种现象就称为幻读

时间事务a事务bT1beginbeginT2select count(*) from table where id=12 (record=0)T3insert into table (id) value(12)T4commitT5select count(*) from table where id=12 (record=1)T6commit

解决方案:

  • Repeatable read及以上级别,通过间隙锁防止幻读的出现。
3. 四种隔离级别
  • read uncommitted(读未提交):所有事务都可以看到其他未提交事务的执行结果。

  • read committed(读已提交):一个事务只能看到已经提交事务所做的改变,可以避免脏读的发生。

  • repeatable read(可重复读): InnoDB默认隔离级别,确保同一个事务的多个实例在并发读取数据时,会看到同样的数据行,解决了不可重复读的问题。

  • serializable(串行):通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。

  • 读数据一致性脏读不可重复读幻读read uncommitted最低级别,不读取损害的数据☑️☑️☑️read committed语句级☑️☑️repeatable read事务级☑️serializable最高级,事务级
3.1 幻读与不可重复读的区别
  • 不可重复读(修改):在同一个事务中,同样的条件,第一次读的数据和第二次读的数据不一致。(有其他事务提交了修改)

  • 幻读(新增或者删除):在同一个事务中,同样的条件,第一次和第二次读出来的记录数量不一样。(有其他事务插入或者删除了数据)

3.2 不可重复读和脏读的区别
  • 脏读读到未提交的数据
  • 不可重复读读到是
3.3 查看隔离级别
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)

3.4 设置隔离级别
set session transaction isolation level read uncommitted;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5673168.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存