事务的特性以及隔离级别

事务具有哪些特性

ACID:

  • 原子性(Atomicity)

    事务是数据库的逻辑工作单位,事务中包含的各个操作要么都完成,要么都不完成

  • 一致性(Consistency)

    事务一致性是指数据库中的数据在事务操作前后都必须满足业务规则约束,比如a转账给b,那么转账前后,ab账户的总金额应该是一致的

  • 隔离性(Isolation)

    一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰(设置不同的隔离级别,互相干扰的程度会有所不同)

  • 持久性(Durability)

    事务一旦提交,结果便是永久性的。即使发生宕机,仍然可以依靠事务日志完成数据的持久化。

其中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是目的

事务的隔离级别

  • READ UNCOMMITTED 读未提交,脏读,不可重复读,幻读有可能发生。
  • READ COMMITED 读已提交,可避免脏读的发生,不可重复读、幻读有可能发生。
  • REPEATABLE READ 可重复读,可避免脏读、不可重复读的发生,但幻读有可能发生。
  • SERIALIZABLE 串行化,可以避免脏读、不可重复读、幻读的发生,但是性能影响比较大。

幻读:【举例:一个事务负责更新全表的数据,但是其间有其他事务向其中插入新的数据,更新全表的事务提交后发现竟然有未更新的数据行,就像发生了幻觉一样。】

mysql演示

关闭事务的自动提交

查看隔离级别

读未提交演示

李四出现了脏读,不可重复读,凭空欠了张三500

读已提交演示

首先设置隔离级别,不再演示

虽然不会出现脏读,没出现前面的凭空欠钱的情况,但是李四在一个事务中的两次读取结果是不一致的,这里虽然没什么问题,但是有些场景下,是需要一个事务中的多次读取结果一致的。

可重复性读演示

首先设置隔离级别,不再演示

没有出现脏读,不可重复读的情况,如果想要读到新的提交的数据,必须要开启新的事务

串行化

首先设置隔离级别,不再演示

区别于并行,想当于一个锁表的动作,当一个事务操作一张表的时候,将会暂停其他事务的执行。

串行化可以避免并行的问题,但是有十分明显的性能下降。


事务的特性以及隔离级别
https://blog.wangxk.cc/2020/10/07/事务的特性以及隔离级别/
作者
Mike
发布于
2020年10月7日
许可协议