首先要知道事务有隐式和显示之分。
显示事务
开启事务:
start transaction;
begin;
SQL操作:
DML
结束事务:
commit;
rollback;
隐式事务
数据库中的SQL语句都作为单个事务去执行。这是由于数据库设置了自动提交。
设置一个系统变量autocommit
如何关闭自动提交
两种方式
方式一
set autocommit = false;
set autocommit = 0;
查看autcommit
变量的值:
SHOW VARIABLES LIKE ‘autocommit’;
注意:
如果是 OFF 就说明关上了,再单独去执行SQL就不会自动提交了,直到手动执行commit才会提交 或者回滚
方式二:
执行start transaction 或者 begin系统就知道后面的一组SQL操作是一个事务了,就不会自动提交了。
补充
下面的补充知识是关于隐式提交数据
的相关内容,很有必要要知道
- 数据定义语言(DDL)
数据库对象,指的就是数据库、表、视图、存储过程等结构。当我们使用CREATE、ALTER、DROP等语句去修改数据库对象时,就会隐式的提交前边语句所属于的事务.
Begin; #开启事务
select ... #事务中的一条语句
update ... #事务中的一条语句
.... #事务中的其他语句
Create table ... #隐式的提交前边语句所属于的事务
- 隐式使用或修改MySQL数据库中的表
当我们使用ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD等语句时也会隐式的提交前边语句所属于的事务。 - 事务控制或关于锁定的语句
①当我们在一个事务还没有提交或回滚时又使用start transaction,或者 begin 开启新的事物,会隐式提交上一个事务。
②当前的autocommit 为 OFF时,更改为ON时,也会隐式的提交前边语句所属的事务。
③使用LOCK TABLES、UNLOCK TABLES等关于锁定的语句也会隐式的提交前边语句所属的事务。 - 加载数据的语句
使用LOAD DATA语句来批量往数据库中导入数据时,也会隐式的提交前边语句所属的事务。
关于MySQL复制的一些语句使用START SLAVE、STOP SLAVE、RESET SLAVE、CHANGE MASTER TO等语句时会隐式的提交前边语句所属的事务。
其它的一些语句使用ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE、RESET等语句也会隐式的提交前边语句所属的事务。