mysql数据库事务隔离级别及脏读,不可重复读,幻读是什么

mysql数据库事务隔离级别及脏读,不可重复读,幻读是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

一、数据库事务正确执行的四个基本要素

<强> 1.1酸原则。

? ?酸原则是数据库事务正常执行的四个基本要素,分别指原子性,一致性,独立性及持久性。

? ? <强>事务的原子性(原子性)是指一个事务要么全部执行,要么不执行,也就是说一个事务不可能只执行了一半就停止了,比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱。不可能划了卡,而钱却没出来,这两步必须同时完成。要么就不完成。

? ? <强>事务的一致性(一致性)是指事务的运行并不改变数据库中数据的一致性,例如,完整性约束了a + b=10,一个事务改变了,那么b也应该随之改变。或者说,给b转账300元钱,那么一个的账户就必须是减少了300元钱,b的账户就必须是增加300元钱,不能说是增加或减少了如200元钱等,这里符合事务的原子性,但是不符合事务的一致性。往实际业务中没有这么简单,往是类似买东西扣库存这类的逻辑,主表里有库存,库存表里有库存,SKU表里还有,然后就因为设计缺陷,就算加了事务还是出现了超卖,SKU库存对不上总库存的问题,这个就是一致性不满足的了。

? ? <强>独立性(隔离):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态,因为这样可能会导致数据不一致。

? ? <强>持久性(耐久性):一旦事务提交或者回滚,这个状态都要持久化到数据库中,不考虑隔离性会出现的读问题。

<人力资源/>

<强> 1.2脏读,不可重复读,幻读。

? ?<强>脏读(脏读):在一个事务中读取到另一个事务没有提交的数据,例如,当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

? ?<>强不可重复读 (NonRepeatable读):既不能读到相同的数据内容。是指在一个事务内,多次读同一数据,在这个事务还没有结束时,另外一个事务也访问该同一数据并且修改,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的的数据可能是不一样的。

? ?<强>幻读(幻像读):在一个事务中,两次查询的结果不一致(针对的插入操作)。是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
? ?例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

<人力资源/>

二、数据库事务隔离级别

? ?数据库事务的隔离级别有4个,由低到高依次为读未提交(读未提交),读取提交(读提交),可重复读(可重复读),序列化(序列化),这四个级别可以逐个解决脏读,不可重复读,幻读这几类问题。

<强> 2.1读未提交(读未提交)

? ?公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资到账5000元整,非常高兴。可是不幸的是,领导发现发给singo的工资金应该是2000元,于是迅速回滚了事务(将5000元回滚),修改金额后(修改为2000元),将事务提交,最后singo实际的工资只有2000元,singo空欢喜一场。

? ?出现上述情况,即我们所说的脏读,两个并发的事务,“事务:领导给singo发工资”、“事务B: singo查询工资账户”,事务B读取了事务一个尚未提交的数据。

? ?当隔离级别设置为未提交读(读未提交)时,就可能出现脏读,如果我们此时将隔离级别提升为阅读承诺(读已提交),便可避免脏读。

<人力资源/>

<强> 2.2读承诺(读已提交)

? ?singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,到底是啥情况呢?

mysql数据库事务隔离级别及脏读,不可重复读,幻读是什么