栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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事务b
T1beginbegin
T2100100
T3-10
T4commit
T5+20
T6commit
T7120

解决方案:

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

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

时间事务a事务b
T1beginbegin
T2100100
T3update 110
T4select 110
T5rollback

解决方案:

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

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

时间事务a事务b
T1beginbegin
T2100100
T3update 110
T4commit
T5110
T6commit

解决方案:

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

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

时间事务a事务b
T1beginbegin
T2select count(*) from table where id=12 (record=0)
T3insert into table (id) value(12)
T4commit
T5select 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;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667912.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号