MySQL之多事务并发执行问题

数据库事务定义

数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。由事务的定义可以看出,数据库事务是由一系列的操作组成的,如果单个事务执行时,可以按照顺序有序的执行,除非事务执行期间,数据库断电等会造成事务执行失败,从而触发回滚操作。但是如果多个数据库事务并发执行时,将会引发各种各样的问题。

事务并发执行引发的问题

在叙述事务并发执行引发的问题之前,需要明确的一点是,MySQL中的所有操作都是基于存储引擎中的Buffer Pool中,所谓Buffer Pool就是系统给MySQL开辟的一块儿内存。

假设当前数据库中同时有两个事务并发执行,分别为事务A和事务B,当事务A将数据1更新成2,然后事务B也需要将同一行的数据修改为3,假设事务A执行途中出现错误,无法继续执行,需要回滚数据,那么现在数据中的值将变为1,事务B对数据的修改就会消失,这种现象就是脏写问题。

所谓脏写就是修改了另一个事务未提交的数据。

如果事务A将某一行数据中的值由1修改为2,事务C读取了事务A修改以后的值,然后事务A执行出错,需要回滚数据,则该行数据将被回滚到最初的值,也就是1,事务C在2的基础上进行一系列操作,那么结果也就是不可信了,这种现象就是事务的脏读问题。

所谓脏读就是读取了还未提交的数据,然后事务回滚以后,造成的数据不一致。

假设事务A和事务B并发执行,事务A首先查询某一行的数据,然后事务B对改行数据进行了修改,并将修改后的数据提交了,事务A在第二次查询的时候,就会出现两次查询结果不一样的情况,这种现象就是数据库事务的不可重复读。

所谓不可重复读就是在事务执行期间,有另一个事务对需要使用的数据进行了修改,并提交了数据。

事务A需要使用到user表的数据总量,假设当前user表中共有3条数据,在事务A执行期间,事务B往user表中添加了一条数据,那么事务A下次查询user表中的数据总数时,则会显示为4条,这种现象就是数据库事务中最为神秘的幻读。

所谓幻读就是在两次相同条件的查询期间,满足条件的数据出现了变动。

SQL标准定义之事务隔离级别

在SQL标准中规定了4种事务隔离级别,所谓隔离级别就是在多个事务并发运行时,互相是如何隔离的,从而来避免一些事务并发运行时产生的问题。

这四种级别分别为:read  uncommitted(读未提交)、read committed(读已提交)、repeatable read(可重复读)、serizlizable(串行化)

第一种的read uncommitted隔离级别,是不允许脏写发生的。

也就是说这个级别只是保证两个事务在没有提交的情况下不能对同一条数据进行修改,这个隔离级别下,有可能发生脏读、不可重复读、幻读,所以不建议使用该级别。

第二种的read committed级别,可以防止脏读和脏写问题发生。

也就说这个级别可以保证事务无法读取到未提交数据,但是有可能发生不可重复读和幻读,如果别的事务修改了数据并提交以后,你的事务就会读到新的数据,所以可能会多次读取到的数据不一致。

read committed级别也可以使用首字母缩写RC来代指。

第三种就是repeatable read隔离级别。

该级别下不会发生脏写、脏读、不可重复读的问题,当使用该级别时,即使别的事务修改了数据并提交了,原来的事务依然不会读取到被修改的值,读取到的值仍然和第一次读取到的值相同,也就是说,事务一旦开始,多次查询一个数据,会得到同样的值。repeatable read级别也可以使用首字母RR来代指。

最后一种隔离级别是serizlizable,即串行化。

该级别根本不允许多事务并发执行,只能顺序执行,所以根本不会发生脏写、脏读、不可重复读、幻读等问题。该级别对性能影响极大,没有特殊情况下,不建议使用。

下一次就来介绍一下MySQL是如何实现这四种事务隔离级别的。

最后,推荐一个很优秀个MySQL专栏儒猿技术窝MySQL专栏

  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值