2. 链式事务
3. 嵌套事务
4. 自治事务
{"db":"ytt"},"port":"3320"}-mysql>truncate c1;
Query OK, 0 rows affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>
{"db":"ytt"},"port":"3320"}-mysql>
{"db":"ytt"},"port":"3320"}-mysql>use ytt
Database changed
{"db":"ytt"},"port":"3320"}-mysql>begin;
Query OK, 0 rows affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>insert into c1 values (1,20,now());
Query OK, 1 row affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>savepoint s1;
Query OK, 0 rows affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>insert into c1 values (2,30,now());
Query OK, 1 row affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>savepoint s2;
Query OK, 0 rows affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>insert into c1 values (3,40,now());
Query OK, 1 row affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>rollback to savepoint s2;
Query OK, 0 rows affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>commit;
Query OK, 0 rows affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>select * from c1;
+----+------+---------------------+
| id | c1 | c2 |
+----+------+---------------------+
| 1 | 20 | 2019-12-02 10:07:02 |
| 2 | 30 | 2019-12-02 10:07:12 |
+----+------+---------------------+
2 rows in set (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>
2. 链式事务
begin;SQL2;
那此时 sql 2 和 rollback 语句其实是一个事务块儿了。最终结果就是只有两条记录。
{"db":"ytt"},"port":"3320"}-mysql>truncate table c1;
Query OK, 0 rows affected (0.01 sec)
{"db":"ytt"},"port":"3320"}-mysql>set completion_type=1;
Query OK, 0 rows affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>insert into c1 values (4,50,now());
Query OK, 1 row affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>insert into c1 values (5,60,now());
Query OK, 1 row affected (0.00 sec)
-- sql 1
{"db":"ytt"},"port":"3320"}-mysql>commit work;
Query OK, 0 rows affected (0.00 sec)
-- sql 2
{"db":"ytt"},"port":"3320"}-mysql>insert into c1 values (6,70,now());
Query OK, 1 row affected (0.00 sec)
-- sql 3
{"db":"ytt"},"port":"3320"}-mysql>rollback;
Query OK, 0 rows affected (0.01 sec)
{"db":"ytt"},"port":"3320"}-mysql>select * from c1;
+----+------+---------------------+
| id | c1 | c2 |
+----+------+---------------------+
| 4 | 50 | 2019-12-02 10:14:16 |
| 5 | 60 | 2019-12-02 10:14:31 |
+----+------+---------------------+
2 rows in set (0.00 sec)
3. 嵌套事务
commit;begin;
那之后的 rollback 其实只回滚了一条记录。最终记录数为 ID=7 这条。
{"db":"ytt"},"port":"3320"}-mysql>truncate table c1;
Query OK, 0 rows affected (0.01 sec)
{"db":"ytt"},"port":"3320"}-mysql>begin;
Query OK, 0 rows affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>insert into c1 values (7,80,now());
Query OK, 1 row affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>begin;
Query OK, 0 rows affected (0.01 sec)
{"db":"ytt"},"port":"3320"}-mysql>insert into c1 values (8,90,now());
Query OK, 1 row affected (0.00 sec)
{"db":"ytt"},"port":"3320"}-mysql>rollback;
Query OK, 0 rows affected (0.01 sec)
{"db":"ytt"},"port":"3320"}-mysql>select * from c1;
+----+------+---------------------+
| id | c1 | c2 |
+----+------+---------------------+
| 7 | 80 | 2019-12-02 10:24:44 |
+----+------+---------------------+
1 row in set (0.00 sec)
4. 自治事务
{"db":"(none)"},"port":"3326"}-mysql>use ytt
Database changed
{"db":"ytt"},"port":"3326"}-mysql>create table log(err_msg varchar(200))engine myisam;
Query OK, 0 rows affected (0.01 sec)
{"db":"ytt"},"port":"3326"}-mysql>begin;
Query OK, 0 rows affected (0.00 sec)
{"db":"ytt"},"port":"3326"}-mysql>insert into t1 values (100);
Query OK, 1 row affected (0.01 sec)
{"db":"ytt"},"port":"3326"}-mysql>insert into log values ('这个记录不应该插入进来');
Query OK, 1 row affected (0.00 sec)
{"db":"ytt"},"port":"3326"}-mysql>select * from t1;
+------+
| id |
+------+
| 100 |
+------+
1 row in set (0.00 sec)
{"db":"ytt"},"port":"3326"}-mysql>rollback;
Query OK, 0 rows affected, 1 warning (0.00 sec)
{"db":"ytt"},"port":"3326"}-mysql>select * from log;
+-----------------------------------+
| err_msg |
+-----------------------------------+
| 这个记录不应该插入进来 |
+-----------------------------------+
1 row in set (0.00 sec)
总结
本篇内容主要把 MySQL 的事务类别简单介绍了下,针对了日常使用的几种场景做了简单的 SQL 演示,希望对大家有帮助。