MYSQL中默认隐式事务及利用事务DML
一:默认情况下,MySQL采用autocommit模式运行。这意味着,当您执行一个用于更新(修改)表的语句之后,MySQL立刻把更新存储到磁盘中。默认级别为不可重复读。
二:会造成隐式提交的语句
以下语句(以及同义词)均隐含地结束一个事务,似乎是在执行本语句前,您已经进行了一个COMMIT。
(1)ALTER
FUNCTION, ALTER PROCEDURE, ALTER TABLE, BEGIN, CREATEDATABASE, CREATE
FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATETABLE, DROP DATABASE,
DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROPTABLE, LOAD MASTER DATA,
LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1,START TRANSACTION, TRUNCATE
TABLE, UNLOCK TABLES.
(2) 当当前所有的表均被锁定时,UNLOCK TABLES可以提交事务。
(3)
CREATE TABLE, CREATE DATABASE DROP DATABASE, TRUNCATE TABLE,ALTER
FUNCTION, ALTER PROCEDURE, CREATE FUNCTION, CREATE PROCEDURE,DROP
FUNCTION和DROP PROCEDURE等语句会导致一个隐含提交。
(4) InnoDB中的CREATE TABLE语句被作为一个单一事务进行处理。这意味着,来自用户的ROLLBACK不会撤销用户在事务处理过程中创建的CREATE TABLE语句。
事务不能被嵌套。这是隐含COMMIT的结果。当您发布一个START TRANSACTION语句或其同义词时,该COMMIT被执行,用于任何当前事务。
三:利用事务DML:
1.SET AUTOCOMMIT = {0 | 1}
2.使用START TRANSACTION,autocommit仍然被禁用,直到您使用COMMIT或ROLLBACK结束事务为止。然后autocommit模式恢复到原来的状态。
3.您也可以按照如下方法开始一项事务:
START TRANSACTION WITH CONSISTENT SNAPSHOT;
WITH
CONSISTENTSNAPSHOT子句用于启动一个一致的读取,用于具有此类功能的存储引擎。目前,该子句只适用于InnoDB。该子句的效果与发布一个STARTTRANSACTION,后面跟一个来自任何InnoDB表的SELECT的效果一样。此称为“非一致的非锁定读取”