MySQL事务及ACID特性和并发带来的问题以及四种隔离级别

事务是什么?

事务(Transaction)是访问并可能更新数据库中各项数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位。

事务的结束有两种结果,要么事务中的步骤全部执行完成,其中一个发生失败,那么将发生回滚操作,撤销事务中的所有操作,回滚到最近一次事务开始的地方。

事务的四个特性

事务的四个特性ACID

  • 原子性(Atomicity)

原子性是指事务是一个不可分割的整体,整个事务要么全部成功,要么全部失败回滚,不能执行一个事务的一部分操作。

  • 一致性(Consistency)

一致性是指数据库必须从一个一致性状态变换到另外一个一致性状态。事务前后保证数据的完整性必须保持一致。

  • 隔离性(Isolation)

隔离性是指一个事务的执行不能有其他事务的干扰,事务的内部操作和使用数据对其他的并发事务是隔离的,互不干扰。

  • 持久性(Durability)

持久性是指一个事务一旦提交,对数据库中数据的改变就是永久性的。此时即使数据库发生故障,修改的数据也不会丢失。接下来其他的操作不会对已经提交了的事务产生影响。

事务的并发带来的问题

  • 脏读:读取数据错误

一个事务读取到另外一个事务修改但并未提交的数据,即称为脏读。事务A修改了一条数据,但是并未提交,此时事务B读取到了这条数据,随后事务A又对该数据进行修改,或者事务回滚,则此时事务B读取到的数据和真实数据是不一样的,即出现了脏读。

  • 幻读:读取数据消失和显现

一个事务读取到另外一个事务删除或者新增的数据,即事务A在查某条数据时,查到该条数据,则判定该条数据不存在,但是紧接着事务A再次查询该条数据,此时又查到了数据,就好像幻觉一般。其原因是在两次查找间隙,事务B插入了该条数据。反之先查到,再查数据消失,是因为事务B在两次查找间隙删除了该条数据。

  • 不可重复读:连续读取同一个数据发生变化

在数据库的访问中,一个事务范围内连续多次查询同一条数据却返回了不同的数据,此时成为不可重复读。这是由于在查询间隔中,其他事务修改并提交引起的。

事务的隔离级别

  • 读未提交(Read Uncommitted)

一个事务能够读取到另外一个事务已经修改但是未提交的数据。事务中的数据即便没有提交,其他事务也能够读取到。这种情况下脏读、幻读、不可重复读都有可能出现。

  • 读已提交(Read Committed)

事务中的修改,只有在该事务提交以后,才能被其他事务所查看。这种情况下解决了脏读,但是幻读和不可重复读还有可能出现。

  • 可重复读(Repeated Read)MySQL默认

保证了在同一事务中先后执行的多次查询将返回同一结果,看到的每行的记录的结果是一致的,不受其他事务的影响。但是这种级别下有可能发生幻读。

  • 可串行化(Serializable)

不允许事务并发执行,强制事务串行执行,就是在读取的每一行数据上都加上了锁,读写相互都会阻塞,所以效率很低下。这种隔离级别最高,是最安全的,但是性能最低,不会出现脏读,不可重复读,幻读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友人和他的朋友们

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值