mysql事务详解、隔离极别、脏读、幻读

mysql事务是指将数据库从一种一致性状态转到另一种一致性状态

mysql事务具有ACID特性:

原子性(Atomicity):事务中的所有操作,要么全部执行,要么都不执行
一致性(Consistency):事务开始和结束后,数据库的完整性不会被破坏
隔离性(Isolation):事务之间互不影响。事务的隔离级别有四种:读未提交、读已提交、可重复读(默认隔离级别)、串行化
持久性(Durability):事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失

一 数据库事务的隔离级别

读未提交(read uncommited):最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。即事务对数据库数据所做的修改,在事务未提交之前,可以被其他事务看到。A事务对数据库数据做的修改,在A事务未提交时,事务B可读到A事务对数据所做的修改。
容易产生的问题:脏读。由于事务B可读到事务A所做的修改,但是A并没有提交,如果事务A执行过程中发生异常回滚,则会导致事务B读到的是错误数据,即脏数据

读已提交(read commited):大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。A、B两个数据同时对数据库中同一条数据做修改,A事务开启,读取数据,此时,B事务也开启,读取数据,并对数据做出修改,然后提交,此时事务A继续执行,执行完后,再次读取数据,发现两次读取的结果不一样,由此产生不可重复读的问题。

可重复读(repeatable read):mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。A事务读取数据库数据,在处理业务的过程中事务B读取数据并修改完成后,事务A再次读取数据时,所得结果和之前读取的数据一致,并且事务A提交后,不会损害数据的一致性。可能产生的问题:幻读。如:事务A开启,读取用户x的age为15,B事务开启age读取用户x的age并加1,此时用户x的age为16,A事务继续执行,将用户x的age加1,提交后,发现x用户的age值为17.从用户的角度来看,数据的一致性并没有被破坏,但A事务可能将读取到的数据15返回给用户,导致幻读。

串行化(serializable):最高隔离级别。所有事务操作依次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它。表上的一个事务开启后,在该事务提交之前,其他事务不能对表中的数据做任何修改。该隔离级别会锁表。

二 不同事务级别带来的并发问题

1 脏读
脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。

2 不可重复读
不可重复读的重点是修改: 同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
在基于锁的并行控制方法中,如果在执行select时不添加读锁,就会发生不可重复读问题。
在多版本并行控制机制中,当一个遇到提交冲突的事务需要回退但却被释放时,会发生不可重复读问题。

3 幻读
幻读的重点在于新增或者删除 (数据条数变化)。同样的条件, 第1次和第2次读出来的记录数不一样
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。
发生的情况:没有范围锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值