MySQL 事务特性以及事务隔离级别

事务的概念

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

事务特性(ACID)

事务拥有四个重要的特性:

  • 原子性(Atomicity)
    事务开始后所有操作,要么全部完成,要么全部失败。在事务的执行过程中出现错误,会回滚到事务开始前的状态。

  • 一致性(Consistency)
    指事务将数据库从一种状态转变为另一种一致的状态。事务开始前和开始后,数据库的完整性没有被破坏。

  • 隔离性(Isolation)
    要求每个读写事务的对象对其他事务的操作对象能相互分离。即该事务提交前对其他事务不可见。
    注:MySQL通过锁机制来保证事务的隔离性。

  • 持久性(Durability)
    事务一旦提交,则其结果就是永久性的。
    注:MySQL使用 redo log 来保证事务的永久性。

脏读

一个事务读到了另一个未提交事务修改过的数据。例如,事务A读取了一条记录(id=1,name=“zhangsan”),然后将“zhangsan”改成了“lisi”,但是事务A还没有提交,此时另一个事务B到来并也读取了这一条记录,而读到的数据是(id=1,name=“lisi”)。如果事务A发生回滚,那么事务B读到的记录将是一个不存在的数据。这个现象称为脏读。

不可重复读

在一个事务内两次读取同一条记录时,得到的结果不一致。例如,事务A读取了一条记录(id=1,name=“zhangsan”),在事务A未结束之前,另一个事务B也读取了同一条记录(id=1,name=“zhangsan”),然后将“zhangsan”改成了“lisi”并且提交了修改,然后事务A再次读取这一条记录(id=1,name=“lisi”)时,发现前后两次读取到的记录不一致。这个现象称为不可重复读。

幻读

在一个事务内两次以相同的查询条件查询一些记录时,得到的记录条数不一致。例如,事务A以某个查询条件查询到了4条记录,在事务A未结束之前,事务B插入(或删除)了一条符合事务A查询条件的记录,然后事务A再以相同的条件查询时,得到的记录条数不一致。

事务的隔离级别

  • READ UNCOMMITED(读未提交)
  • READ COMMITED(读已提交)
  • REPEATABLE READ(可重复读)
  • SERIALIZABLE(可串行化)
隔离级别 脏读 不可重复读 幻读
READ UNCOMMITED(读未提交)
READ COMMITED (读已提交) ×
REPEATABLE READ(可重复读) × ×
SERIALIZABLE(可串行化) × × ×

注:√:会发生       ×:不会发生

推荐相关文章:

https://developer.ibm.com/zh/technologies/databases/articles/os-mysql-transaction-isolation-levels-and-locks/

https://juejin.im/post/6844903827611582471

猜你喜欢

转载自blog.csdn.net/qq_47768542/article/details/109317183