Innodb存储引擎 Ch7 事务

1 概述

1.1 扁平事务Flat Transaction

出错时,回滚所有操作。

  • 成功完成,约占96%。
  • 应用程序要求停止事务,约占3%。回滚。
  • 由于外界原因,如超时,强制终止,约占1%。回滚。
    回滚事务 ROLLBACK WORK

1.2 带有保存点的扁平事务Flat Transactions with Savepoint

出错时,回滚到保存点(savepoint)位置。保存点用SAVE WORK函数建立,通知系统记录当下的处理状态。保存点在事务内部是递增的,即便回滚以后,保存点的号码也会根据之前可能已经被回滚的保存点的编号而增长。
插入保存点命令:SAVEPOINT s1
回滚到保存点:ROLLBACK TO SAVEPOINT s1

mysql> TRUNCATE test26;
Query OK, 0 rows affected (0.28 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test26 VALUES(1, 20, now());
Query OK, 1 row affected (0.00 sec)

mysql> SAVEPOINT s1;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test26 VALUES(2, 30, now());
Query OK, 1 row affected (0.00 sec)

mysql> SAVEPOINT s2;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test26 VALUES(3, 40, now());
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM test26;
+----+-----+----------+
| id | num | ttime    |
+----+-----+----------+
|  1 |  20 | 11:16:54 |
|  2 |  30 | 11:17:22 |
|  3 |  40 | 11:17:58 |
+----+-----+----------+
3 rows in set (0.00 sec)

mysql> ROLLBACK TO SAVEPOINT s2;
Query OK, 0 rows affected (0.00 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.04 sec)

mysql> SELECT * FROM test26;
+----+-----+----------+
| id | num | ttime    |
+----+-----+----------+
|  1 |  20 | 11:16:54 |
|  2 |  30 | 11:17:22 |
+----+-----+----------+
2 rows in set (0.00 sec)

1.3 链事务Chained Transaction

由于带有保存点的扁平事务在发生系统崩溃时会丢失所有的保存点,即保存点是易失的(volatile)而非持久的(persistent),此时需要从头开始执行。链事务的思想是,在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务。链事务中的回滚仅限于当前事务,且在提交后会释放当前事务所持有的锁,而带有保存点的扁平事务则不影响迄今为止所有的锁。
将上一个事务的提交和下一个事务的操作合并为一个原子操作,即上一个事务提交触发下一个事务的开始。
打开链事务 COMPLETION_TYPE=1

mysql> TRUNCATE test26;
Query OK, 0 rows affected (0.28 sec)

mysql> set completion_type=1;
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test26 VALUES(1, 20, now());
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO test26 VALUES(2, 30, now());
Query OK, 1 row affected (0.00 sec)

mysql> COMMIT WORK;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test26 VALUES(3, 20, now());
Query OK, 1 row affected (0.00 sec)

mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

当执行完commit后,下一句插入操作实际上是BEGIN; INSERT,即默认开始了下一个事务。回滚只会回滚第二个事务,且上面的操作都已经保存。

1.4 嵌套事务Nested Transaction

一个层次结构框架。

  • 子事务可以是扁平事务,也可以是嵌套事务。
  • 叶节点的事务是扁平事务。只有叶节点可以访问数据库、发送消息、获取其他类型的资源。
  • 高层事务仅负责控制逻辑。
  • 上层事务提交才能提交其子事务。上层事务回滚会引起所有子事务回滚。因此子事务只满足A, C, I特性。因为Duration要求事务一旦提交,结果是永久性的。但是上层事务却能引起子事务的回滚,所以不满足。
  • 另外,父事务可以传递或反向继承子事务的锁。

使用保存点技术可以模拟嵌套事务的结构,有的时候更加灵活,可以按照一开始执行的顺序线性地回滚事务。但是这也同样带来一个缺点,即用户无法进行对象的访问控制,所有对象都可以被得到和访问。但嵌套查询中,不同子事务在数据对象上持有不同的锁。
嵌套查询能够实现并行,但是保存点技术显然不能。

1.5 分布式事务Distributed Transaction

在分布式环境下运行的扁平事务。

Innodb不支持嵌套事务。可以通过保存点技术模拟串行的嵌套事务。




\

2 实现

Atomicity: 原子性

主要涉及Innodb的事务。

  • Autocommit setting.
  • COMMIT statement.
  • ROLLBACK statement.
  • Operational data from the INFORMATION_SCHEMA tables.

Consistency: 一致性

主要涉及事务处理,防止数据丢失和系统崩溃带来的损失。
由undo log实现。

  • InnoDB doublewrite buffer.
  • InnoDB crash recovery.

Isolation: 隔离性,

由锁机制实现。

  • Autocommit setting.
  • SET ISOLATION LEVEL statement.
  • The low-level details of InnoDB locking. During performance tuning, you see these details through INFORMATION_SCHEMA tables.

Durability: 持久性

由redo log实现。

  • InnoDB doublewrite buffer, turned on and off by the innodb_doublewrite configuration option.
  • Configuration option innodb_flush_log_at_trx_commit.
  • Configuration option sync_binlog.
  • Configuration option innodb_file_per_table.
  • Write buffer in a storage device, such as a disk drive, SSD, or RAID array.
  • Battery-backed cache in a storage device.
  • The operating system used to run MySQL, in particular its support for the fsync() system call.
  • Uninterruptible power supply (UPS) protecting the electrical power to all computer servers and storage devices that run MySQL servers and store MySQL data.
  • Your backup strategy, such as frequency and types of backups, and backup retention periods.
  • For distributed or hosted data applications, the particular characteristics of the data centers where the hardware for the MySQL servers is located, and network connections between the data centers.

redo log通常是物理日志,一般是顺序写的,记录页的物理修改操作。
undo log通常是逻辑日志,一般是随机读写,根据每行操作进行记录。



\

2.1 redo log

组成
重做日志缓冲 redo log buffer
重做日志文件 redo log file

fsync
一种从重做日志文件刷新数据到磁盘的方法。fsync的效率取决于磁盘性能,因此磁盘性能决定了事务提交的性能,即数据库的性能。
innodb_flush_log_at_trx_commit控制重做日志刷新到磁盘的策略。

  • 默认为1,表示事务提交时必须执行一次fsync。
  • 0,表示事务提交时不执行,仅在master thread中执行fsync。
  • 2,表示事务提交时不执行fsync,仅将重做日志写入文件系统缓存。
SET GLOBAL innodb_flush_log_at_trx_commit=0;

采用0,2两种方式可以提高事务执行速度,但是不符合事务的ACID特性。对于大批量数据来说,一般在执行之后进行COMMIT,而不是每一行都COMMIT。

重做日志块 log block
重做日志大小为512 Byte进行存储,因而为重做日志块,和磁盘扇区大小一样。

重做日志组 log group
是一个逻辑上的概念。

redo log和二进制日志的区别
重做日志在Innodb的存储引擎层建立,二进制日志则在上层,不仅仅针对Innodb,包含了任何存储引擎对于数据库的更改。
重做日志是物理格式的日志,记录对每个的修改,恢复比二进制日志快得多。二进制日志记录逻辑(sql语句)。
重做日志是在事务进行过程中不断写入的,二进制日志在事务提交后一次性写入。所以重做日志的顺序不是事务提交的顺序,每个事务只要在进行了就会产生重做日志。

LSN
Log Sequence Number
通过比较页的LSN和重做日志的LSN,判断重写哪些部分。在恢复过程中仅需恢复last checkpoint at 之后的日志部分。

SHOW ENGINE INNODB STATUS;
---
LOG
---
Log sequence number          464955716454 当前LSN
Log buffer assigned up to    464955716454
Log buffer completed up to   464955707956
Log written up to            464955703666
Log flushed up to            464954847989 刷新到重做日志文件的
Added dirty pages up to      464955716454
Pages flushed up to          464947312558
Last checkpoint at           464944629998 刷新到磁盘的
68432638 log i/o's done, 880.00 log i/o's/second

2.2 undo log

作用
undo log位于共享表空间的undo segment段中。undo是逻辑日志,将数据库逻辑的恢复到原来的样子。意思是虽然操作被逻辑上取消了,但是数据结构和页在回滚后可能大不相同。

  • 例如插入新记录后需要回滚,是对insert操作做了delete的操作,但是表空间并没有因此缩小。
  • undo也可以用来进行MVCC。当前事务遇到已锁定的记录时,通过undo读取之前的行版本信息,实现非锁定读取。
  • undo log产生时,同样会产生redo log,实现持久性的保护。

存储管理
为了保证并发和回滚的正常进行,将此类信息存储在rollback segment中。
每个rollback segment包含1024个undo log segment,undo页的申请在undo log segment中完成。
undo log分为insert undo log和update undo log。update undo包含update和delete操作。insert不需要MVCC,提交即可将undo删除;但update需要,因此要放入undo log链表,等待purge线程将其删除。
每行记录有三个额外字段DB_TRX_ID(transaction identifier),DB_ROLL_PTR(roll pointer)和DB_ROW_ID(row ID)。
undo页可以重用。上一个事务提交后,undo进入cache列表。再有事务向rollback segment申请时,可以直接使用该页。

查看undo log数量
查看history list length

SHOW ENGINE INNODB STATUS;
------------
TRANSACTIONS
------------
Trx id counter 62639
Purge done for trx's n:o < 62639 undo n:o < 0 state: running but idle
History list length 0

保存点+链事务:
https://developpaper.com/technology-sharing-nested-transaction-autonomous-transaction-and-chained-transaction-of-mysql/#:~:text=MySQL%20chain%20transaction%20depends%20on%20the%20parameter%20completion_,commit%20%2F%20rollback%20and%20has%20a%20parent-child%20relationship.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值