文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【MySQL】搞懂ACID原则和事务隔离级别

2015-04-28 09:50

关注

【MySQL】搞懂ACID原则和事务隔离级别

宜未雨而绸缪,毋临渴而掘井

说说MySQL的事务

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

一个数据库事务通常包含对数据库进行读或写的一个操作序列。它的存在包含有以下两个目的:

当然并不是所有的数据库都支持事务,事务一般有四个属性:原子性、一致性、隔离性、持久性。简称:ACID原则。接下来我们举例逐个分析:

举例:

我们用一个转账的案例结合每个性质分析,例如:账户A向账户B转账,主要分为一下几个步骤:

  1. 从A账号中把余额读出来(500)。
  2. 对A账号做减法操作(500-100)。
  3. 把结果写回A账号中(400)。
  4. 从B账号中把余额读出来(500)。
  5. 对B账号做加法操作(500+100)。
  6. 把结果写回B账号中(600)。

原子性

保证6个步骤要么全部执行,要么全部不执行,如果失败了就把事务回滚到转账的初始状态。比如:在执行到第五步的之后,账户B突然注销了找不到了,此时账户A的钱也扣了,就必须事务回滚到原来各自的状态也就是A的余额500。

一致性

在转账之前A和B的账户共有500+500=1000,而转账成功之后,A和B的账户是400+600=1000,就是数据的状态在执行该事务操作之后从一个状态改变到了另外一个状态

隔离性

在A给B转账过程中,只要事务没有提交,A和B的账户余额不会存在变化。但是此时账户C也在向账户B转账,最终两个事务提交之后账户B的余额应该是账户A转账的金额加上账户C转账的金额。也就是说多个事务之间不会相互影响,至于C给B转账的时候获取B的余额是已经加了A给B转账的余额还是没加,这个和事务的隔离级别有关系。

持久性

一旦转账成功(事务提交),两个账户的里面的钱就会真的发生变化(会把数据写入数据库做持久化保存)!

事务的隔离级别

隔离级别 脏读 不可重复读 幻读
Read-uncommitted
Read-committed ×
Repeatable-read × ×
Serializable × × ×

隔离级别详解

作用:所有事务都可以看到其他未提交事务的执行结果

例子:

又到月底了,小明的老婆要准备给小明发生活费了,小明的老婆给小明打了500块,但该事务并没有提交,而此时小明正好在查余额,发现是550块,高兴的差点蹦了起来.天有不测风云,突然小明的老婆发现多打了50块,于是回滚事务,修改金额,然后将事务提交,最后小明空欢喜异常。

作用:一个事务只能看见已经提交事务所做的改变

例子:

某个夜黑风高的夜晚,小明丰富的夜生活开始了,小明拿着工资卡去消费,pos机读取卡的信息的时候有500,而此时小红也正好在网上转账,把小明工资卡的500元转到另一账户,并小明之前提交了事务,当小明扣款时,系统检查到小明的工资卡已经没有钱,扣款失败,小明十分纳闷,明明卡里有钱,为什么会说余额不足,出现上述情况,即我们所说的不可重复读,两个并发的事务,“事务1:小明消费”、“事务2:小红网上转账”,事务1事先读取了数据,事务2紧接了更新了数据,并提交了事务,而事务1再次读取该数据时,数据已经发生了改变,当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读

作用:当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,发现和之前不一样。

例子:

小红最近发现小明总是很晚回家并且经常不接电话,于是小红开始查小明当月信用卡的总消费金额,消费金额为50,而小明此时正好在收银台买单,消费1000元,即新增了一条1000元的消费记录,并提交了事务,随后小红将小明当月信用卡消费的明细打印了出来,却发现消费总额为1050元,小红很诧异,以为出现了幻觉

作用:最高级别,防止上述3种情况,事务串行执行,慎用这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而避免了脏读,可重复读,幻读。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争,并发性能最差,在分布式事务中可能会被用到。

参考文献:
http://www.hollischuang.com/archives/898

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯