1、事务的特性

  • 原子性(Atomicity)

事务是一组不可分割的操作单元,这组单元要么同时成功要么同时失败(由DBMS的事务管理子系统来实现);
回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。

  • 一致性(Consistency)

数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。(由DBMS的完整性子系统执行测试任务)

  • 隔离性(Isolation)

一个事务所做的修改在最终提交以前,对其它事务是不可见的。(由DBMS的并发控制子系统实现)

  • 持久性(Durability)

一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
系统发生奔溃可以用重做日志(Redo Log)进行恢复,从而实现持久性。与回滚日志记录数据的逻辑修改不同,重做日志记录的是数据页的物理修改。(由DBMS的恢复管理子系统实现的)

2、事务的实现

2.1、事务实现图示

MySQL事务学习笔记 - 图1

2.2、redo log

2.2.1、redo log 更新过程

MySQL事务学习笔记 - 图2

  • 执行update操作。
  • 先将原始数据从磁盘读取到内存,修改内存中的数据。
  • 生成一条重做日志写入redo log buffer,记录数据被修改后的值。
  • 当事务提交时,需要将redo log buffer中的内容刷新到redo log file。
  • 事务提交后,也会将内存中修改数据的值写入磁盘。

2.2.2、redo log实现事务的原子性和持久性。
  • 原子性,是redo log记录了事务期间操作的物理日志,事务提交之前,并没有写入磁盘,保存在内存里,如果事务失败,数据库磁盘不会有影响,回滚掉事务内存部分即可。
  • 持久性,redo log 会在事务提交时将日志存储到磁盘redo log file,保证日志的持久性。

2.2.3、查看redo log 日志
  1. show engine innodb status
  2. ---
  3. LOG
  4. ---
  5. Log sequence number 11132998721
  6. Log buffer assigned up to 11132998721
  7. Log buffer completed up to 11132998721
  8. Log written up to 11132998721
  9. Log flushed up to 11132998721
  10. Added dirty pages up to 11132998721
  11. Pages flushed up to 11132998721
  12. Last checkpoint at 11132998721
  • Log sequence number 当前日志序列码 LSN
  • Log flushed up to 表示刷新到重做日志文件的 LSN
  • Last checkpoint at 表示刷新到磁盘的 LSN

2.3、undo log

undo log是逻辑日志,只是将数据库逻辑的恢复到原来的样子。并不能将数据库物理地恢复到执行语句或者事务之前的样子。虽然所有的逻辑修改均被取消了,但是数据结构和页本身在回滚前后可能不一样了。

undo log实现了事务的一致性,可以通过undo log恢复到事务之前的逻辑状态,保证一致性。

3、事务控制语句

MySQL事务学习笔记 - 图3

4、事务隔离级别

参考