数据库事务

事务的四大特性(ACID)

  • 原子性(Atomicity):事务要么全部执行成功要么全部失败回滚。
  • 一致性(Consistency):事务在执行前后状态是一致的。
  • 隔离性(Isolation):一个事务所进行的修改在最终提交之前,对其他事务是不可见的。
  • 持久性(Durability):数据一旦提交,其所作的修改将永久地保存到数据库中。

数据库的并发一致性问题

当多个事务并发执行时,可能会出现以下问题:

  • 脏读:事务A更新了数据,但还没有提交,这时事务B读取到了事务A更新后的数据,然后事务A回滚了,事务B读取到的数据就成为脏数据了。
  • 不可重复读:事务A重复读取数据多次,在此期间事务B对数据进行了更新并且提交,导致事务A多次读取到的数据不一致。
  • 幻读:事务A读取数据后,事务B向事务A读取的数据中插入几条数据,事务A再次读取数据时发现多了几条数据。
  • 丢失修改:事务A和事务B都对同一个数据进行修改,事务A先修改,事务B随后修改,事务B的修改覆盖了事务A的修改。

数据库隔离级别

  • 读未提交:一个事务在提交前,它的修改对其他事务也是可见的。
  • 读已提交:一个事务提交之后,它的修改才能被其他事务看到。
  • 可重复的:在同一个事务中多次读取到的数据是一致的。
  • 串行画:需要加锁实现,会强制事务串行执行。

数据库的隔离级别分别可以解决数据库的脏读、不可重复读、幻读等问题。

下面表格说明在特定隔离级别下是否可以解决脏读、不可重复读、幻读等问题。

隔离级别脏读不可重复读幻读
读未提交允许允许允许
读已提交不允许允许允许
可重复读不允许不允许允许
串行化不允许不允许不允许

Ps: 可重复读隔离级别下允许出现幻读。 MySql默认隔离级别是可重复读。

隔离级别是如何实现的

  事务的隔离机制主要是依靠锁机制和MVCC(多版本并发控制-multiple version concurrency control)实现的,读已提交和可重复读可以通过MVCC实现,串行化可以通过锁机制实现。

MVCC是一种控制并发的方法,主要用来提高数据库的并发性能。

  • 当前读:读取的是数据库的最新版本,并且在读取时要保证其他事务不会修改当前记录,所以会对读取的记录加锁。
  • 快照读:不加锁读取操作即为快照读,使用MVCC来读取快照中的数据,避免加锁带来的性能损耗。

MVCC实现原理:

  • 版本号
      1. 系统版本号:是一个自增的ID,每开启一个事务,系统版本号都会递增。
      2. 事务版本号:事务版本号就是事务开始时的系统版本号,可以通过事务版本号的大小判断事务的时间顺序。
  • 行记录隐藏的列
      1.DB_ROW_ID:如果数据表没有指定聚簇索引,InnoDB会利用这个隐藏ID创建聚簇索引。
      2.DB_TRX_ID记录创建这条记录或最后一次修改这条记录的事务ID。
      3.DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本。
  • undo日志
      MVCC使用到的快照会存储到undo日志中,该日志通过回滚指针将一个一个数据行的所有快照连接起来。

如下图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值