事务、特性、隔离级别

什么是事务

  • 事务是指程序中一系列严密的逻辑操作,而且所有操作必须全部完成,否则在每个操作中所做的所有更改都会被撤销。
  • 换言之:就是把多件事情当做一件事情来处理,好比大家同在一条船上,要活一起活,要完一起完。

事务的四个特性

  • 原子性[atomicity]
  • 一致性[consistency]
  • 隔离性[isolation]
  • 持久性[durability]

数据事务的隔离级别

事务的隔离级别有4种,由低到高分别为Read uncommitted、Read committed、Repeatable read、Serializable。而且,在事务的并发操作中可能出现脏读、不可重复读、幻读。

Read uncommitted 最低级别,任何情况都无法保证。

老板要给程序员发工资,程序员的工资是3.6/月。但是发工资时老板不小心按错了数字,按成3.9/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。

实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。

Read committed 可避免脏读的发生。

程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…

这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。

Repeatable read 可避免脏读、不可重复读的发生。

程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。

重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
什么时候会出现幻读?

程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。

Serializable 可避免脏读、不可重复读、幻读的发生。Mysql的默认隔离级别是Repeatable read。

事物并发导致的问题

在许多事物处理同一个数据时,如果没有采取有效的隔离机制,那么并发处理数据时,会带来一些问题。

第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。

小明去银行柜台存钱,他的账户里原来的余额为100元,现在打算存入100元。在他存钱的过程中,银行年费扣了5元,余额只剩95元。突然他又想着这100元要用来请女朋友看电影吃饭,不打算存了。在他撤回存钱操作后,余额依然为他存钱之前的100元。所以那5块钱到底扣了谁的?

第二类丢失更新:是不可重复读的特殊情况。
如果两个事务都读取同一行,然后两个都进行写操作,并提交,第一个事务所做的就会丢失。

小明和女朋友一起去逛街。女朋友看中了一支口红,(对,女朋友就是用来表现买买买的)小明大方的掏出了自己的银行卡,告诉女朋友:亲爱的,随便刷,随便买,我坐着等你。然后小明就坐在商城座椅上玩手机,等着女朋友。这个时候,程序员的聊天群里有人推荐了一本书,小明一看,哎呀,真是本好书,还是限量发行呢,我一定更要买到。于是小明赶紧找到购买渠道,进行付款操作。而同时,小明的女朋友也在不亦乐乎的买买买,他们同时进行了一笔交易操作,但是这个时候银行系统出了问题,当他们都付款成功后,却发现,银行只扣了小明的买书钱,却没有扣去女朋友此时交易的钱。哈哈哈,小明真是太开心了!

脏读举例说明

小明的银行卡余额里有100元。现在他打算用手机点一个外卖饮料,需要付款10元。但是这个时候,他的女朋友看中了一件衣服95元,她正在使用小明的银行卡付款。于是小明在付款的时候,程序后台读取到他的余额只有5块钱了,根本不够10元,所以系统拒绝了他的交易,告诉余额不足。但是小明的女朋友最后因为密码错误,无法进行交易。小明非常郁闷,明明银行卡里还有100元,怎么会余额不足呢?(他女朋友更郁闷。。。)

幻读、虚读举例说明

例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

不可重复读举例说明

例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

不可重复读和脏读的区别

不可重复读和脏读的区别:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。 

幻读和不可重复读都区别

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

英文

  • transation 事务
  • atomicity 原子性
  • consistency 一致性
  • isolation 隔离性
  • durability 持久性
  • read uncommitted 读未提交
  • read committed 读已提交
  • repeatable read 可重复读
  • serializable 串行化

概念

名称 解释
原子性 是操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
一致性 事物的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
隔离性 隔离性是多个用户并发访问数据库时,比如操作同一张表时,数据库为每个用户开启的事务,不能被其他事务的操作所干扰,多个并发事物之间要相互隔离。对于任意两个并发的事务t1和t2,在事物t1看来,t2要么在t1开始之前就已经结束,要么在t1结束之后才开始,这样每个事物都感觉不到其他事务在并发地执行。
持久性 当事务正确完成后,他对于数据的改变时持久的。
读未提交 最低级别,任何情况都无法保证。读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。
读已提交 可避免脏读的发生。读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。
可重复读 可避免脏读、不可重复读的发生。重复读,就是开始读取数据时[事务开启],不在允许修改操作。
串行化 可避免脏读、不可重复读、幻读的发生。是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可避免脏读、不可重复读、幻读。但是这样事务隔离级别效率低下,比较耗数据库性能,一般不使用。
脏读 一个事务处理过程中读取了另一个未提交的事物中的数据。
幻读、虚读 一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。
不可重复读 一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。

相关文章

www.cnblogs.com/Kevin-ZhangCG/p/90...

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2个月前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 3

你怕不是对程序员的工资有什么误解,“万” 这个字是不是写错了。建议学习一下“千”这个字

2个月前 评论

你怕不是对程序员的工资有什么误解,“万” 这个字是不是写错了。建议学习一下“千”这个字

2个月前 评论

每次看这方面内容,每句话都能理解,但是当发生一个问题我就对不上

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!