Mysql 事务ACID和隔离级别

事务(Transaction)

数据库事务是指作为单个逻辑单元执行的一系列操作。
即将一系列Sql语句绑定在一起执行,只有所有语句全部执行完毕才会判定执行成功,然后提交执行结果,否则数据就会回滚(rollback)事务语句执行之前的状态。即若事务的执行被打断导致事务未能完整执行,则之前执行的sql语句也全部作废。

事务的四个特性

事务需要具备四个特性:原子性(Atomicity,也称不可分割性),一致性(Consistency),隔离性(lsolation),持久性(Ddurability)。

1.原子性:有一个事务当中的所有操作看做整体,必须全部执行才会生效,如果中途被打断,则会回滚到事务开始之前的状态,即事务为执行之前的状态。
2.一致性:在事务开始和结束之后,数据库的完整性不会被破坏。这表示写入的数据必须符合所有的预设规则,这也包含数据的精确性,串联性,以及数据库可以自发性完成预定的工作。(比如银行转账,A的账户上减少了100元,那么肯定有一个其它账号多了100元,如果不是这个数字,也是满足事务的原子性的,但是显然和转账的预定规则不符。)
3.隔离性:数据库允许对个并发事务同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致的数据的不一致。
4.可靠性:事务处理结束后,对数据的修改应当是永久的,即使系统故障数据也不会丢失。

Mysql 事务隔离级别

事务并发可能出现的几种问题:

  1. 脏读(Dirty Read):脏读指一个事务读取到了另一个事务未提交的数据。

  2. 不可重复读(No-Repetable Read): 不可重复读指一个事务在读取另一个数据时,有其它事务对该数据所读取的数据进行了修改,导致该数据在事务的多次读取后得到了不同的结果。

  3. 幻读(Phantom read):幻读指事务A在读取数据时,后一次读取到了前一次所没有读取到的新的数据,这种原因是事务A在读取数据或对数据进行操作时,另一个事务对事务进行了删除或插入等操作,导致用户所看到的查询或操作结果和预期不一致,好像是幻觉一样。

  4. 第一类更新丢失(回滚丢失,first lost update):当两个事务都对数据进行更新,但其中一个事务撤销回滚时,覆盖了另一个事务已经提交的数据,称之为第一类更新丢失。

  5. 第二类更新丢失(覆盖丢失,second lost update)指两个事务同时对数据进行操作时,后提交的事务将先提交的事务对数据进行的操作覆盖了。

为了解决mysql事务并发可能出现的问题,Msql提供了四种隔离级别,隔离级别从低到高分别是:读未提交、读已提交 、可重复读和串行化。事务的隔离级别越高,越能保证数据的一致性和完整性,但执行效率也会随之降低。

Mysql的默认隔离级别是可重复读
1.读未提交(Read uncomitted):读未提交是最低的隔离级别,所有事务都能看到其它事务未提交的结果,只能防止第一类更新丢失,一般不用于实际应用。
2.读已提交(Read committed):在该隔离级别下,一个事务的更新操作只有在该事务提交之后其它事物才能看到该事务的执行结果。可以防止脏读和第一类更新丢失。
3.可重复读(Repeatable Read):Mysql事务的默认隔离级别,在该隔离级别下,一个事务在指定数据进行读写时,在该事务未结束之前,其它事务不能对该数据进行操作,可以防止脏读,不可重复读,第一类更新丢失和第二类更新丢失。
4.串行化(Serilaizable):串行化是最高的隔离级别,要求事务序列化执行,事务只能依次执行,不能并发执行,可以解决所有的的并发问题,但是会导致大量的超时和锁竞争,一般不采取该隔离级别。

可以看到,只有串行化可以解决事务的所有的事务并发问题。

脏读不可重复读幻读
读未提交可能可能可能
读已提交不会可能可能
可重复读不会不会可能
串行化不会不会不会

参考文章:彻底搞懂mysql事务隔离级别

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值