mysql truncate 导致事务回滚失败

基础知识

mysql 中的truncate 和delete 都能够清理表中数据,但是它们有什么区别呢

TRUNCATE DELETE
条件删除 不支持 支持
事务回滚 不支持 支持
清理速度
高水位重置

问题

在一个事务中使用了truncate 会导致后续的sql 无法回滚。

MariaDB [test_db]> create table tbl4(id int primary key ,num1 int not null); 
Query OK, 0 rows affected (0.005 sec)

MariaDB [test_db]> insert into tbl4 values (1,2),(2,3),(4,7);                
Query OK, 3 rows affected (0.002 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [test_db]> begin;                                                   
Query OK, 0 rows affected (0.001 sec)

MariaDB [test_db]> truncate tbl4;                                           
Query OK, 0 rows affected (0.005 sec)

MariaDB [test_db]> insert into tbl4 values (1,2),(2,3),(4,7);               
Query OK, 3 rows affected (0.002 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [test_db]> rollback;
Query OK, 0 rows affected (0.001 sec)

MariaDB [test_db]> select * from tbl4;                                      
+----+------+
| id | num1 |
+----+------+
|  1 |    2 |
|  2 |    3 |
|  4 |    7 |
+----+------+
3 rows in set (0.001 sec)

MariaDB [test_db]> 

truncate 会删除所有数据,并且不记录日志,不可以恢复数据,相当于保留了表结构,重新建立了一张同样的表。由于数据不可恢复,truncate 之前的操作也不能回滚。

MariaDB [test_db]> begin;                                    
Query OK, 0 rows affected (0.001 sec)

MariaDB [test_db]> update tbl4 set num1=12 where id=1;  
Query OK, 1 row affected (0.001 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [test_db]> truncate tbl4;
Query OK, 0 rows affected (0.005 sec)

MariaDB [test_db]> rollback;
Query OK, 0 rows affected (0.001 sec)

MariaDB [test_db]> select * from tbl4;
Empty set (0.001 sec)

MariaDB [test_db]> 

你可能感兴趣的:(mysql truncate 导致事务回滚失败)