事务的四种隔离级别详解

1.事务的隔离级别

       数据库事务的隔离级别有4种,由低到高分别为Read Uncommited、Read Commited、Repeatable Read、Serializable。并发数据访问时可能会出现以下问题,3类数据读取问题(脏读、不可重复读、幻读)和2类数据更新问题(第1类丢失更新和第2类丢失更新)。

  • Read Uncommited,读未提交,即一个事务可以读取另一个未提交事务的数据;并发操作会导致脏读
  • Read Commited,读操作,即一个事务要等到另一个事务提交后才能读取数据;解决脏读问题;并发操作会导致不可重复读
  • Repeatable Read,重复读,即开始读取数据(事务开启)时,不再允许修改操作;解决不可重复读问题;并发操作会导致幻读(对应insert操作)
  • Serializable,序列化,最高的事务隔离级别,该级别下,事务串行化顺序执行;避免脏读、不可重复读与幻读;但是该级别效率低下,比较消耗数据库性能,一般不用。
  脏读 不可重复读幻读 第1类丢失更新第2类丢失更新                           备注
Read Uncommited   √       √  √          ×         √ 
  Read Commited   ×       √  √          ×         √

读取事务要等到这个更新操作事务提交后才能读取数据,可以解决脏读问题。

(大多数数据库默认的隔离级别,比如Oracle 、Sql Server)

 Repeatable Read   ×       ×  √          ×         ×

开始读取数据(事务开始)时,不允许修改操作(即update操作)。

MySQL的默认隔离级别

     Serializable   ×       ×  ×          ×         ×以上并发问题都不存在,但是效率低下,一般不用
  对应的是Up date操作对应insert操作   

2.并发问题

       数据库并发访问所产生的问题,在有些场景下可能是允许的,但是有些场景下可能是致命的,数据库通常会通过锁机制来解决数据并发访问问题,按锁对象不同分为表级锁和行级锁;按并发事务锁定关系分为共享锁和独占锁。直接使用锁非常麻烦,为此数据库为用户提供了自动锁机制,用户指定会话的事务隔离级别,数据库就会通过分析SQL语句然后为事务访问的资源加上合适的锁,此外,数据库还会维护这些锁通过各种手段提高系统的性能,这些对用户来讲都是透明的。

  • 脏读:一个事务读取另一个未提交的数据。

  • 不可重复读:一个事务范围内两个相同的查询却返回了不同数据。

  • 幻读:一个事务范围内两个相同的查询却返回了不同数据。对应的是插入操作。

  • 第1类丢失更新:两个事务均进行更新操作,相互影响,某一事务撤销影响最终结果的准确性。

  • 第2类丢失更新:事务A覆盖事务B已经提交的数据,造成事务B所做的操作丢失。为了避免此问题,可以使用Repeatable Read隔离级别,或者查询和更新操作用where、set price=price+10等类型语句。

部分内容参考内容:https://www.cnblogs.com/ubuntu1/p/8999403.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值