ACID
原子性(Atomicity)
隔离性(Isolation)
一致性(consistency)
持久性(Durability)
当把现实世界的状态转换映射到数据库世界时,持久性
意味着该转换对应的数据库操作所修改的数据都应该在磁盘上保留下来,不论之后发生了什么事故,本次转换造成的影响都不应该被丢失掉
事务 是一个概念,它对应着一个或者多个数据库的操作,事务分为以下几个状态:
-
活动的
-
部分提交
-
失败的
-
中止的
-
提交的
MySQL中事务的语法
事务
的本质其实只是一系列数据库操作,只不过这些数据库操作符合ACID
特性而已
开启事务
-
BEGIN [work];
-
START TRANSACTION;
开启事务-
READ ONLY
只读事务,只能读而不能写操作,如:START TRANSACTION READ ONLY;
-
WITH CONSISTANT SNAPSHOT
开启一致性读 -
开启一个读写事务
START TRANSACTION READ WRITE, WITH CONSISTENT SNAPSHOT
-
提交事务
COMMIT;
手动中止事务
ROLLBACK;
支持事务的存储引擎
目前只有InnoDB
和NDB
存储引擎支持
自动提交
MySQL
中有一个系统变量autocommit
:
mysql> SHOW VARIABLES LIKE 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)
SET autocommit = OFF; -- 将事务设置成不可自动提交
隐式提交
当我们使用START TRANSACTION
或者BEGIN
语句开启了一个事务,或者把系统变量autocommit
的值设置为OFF
时,事务就不会进行自动提交
,但是如果我们输入了某些语句之后就会悄悄的
提交掉,就像我们输入了COMMIT
语句了一样,这种因为某些特殊的语句而导致事务提交的情况称为隐式提交
,这些会导致事务隐式提交的语句包括:
-
当定义或者修改数据库的定义语言:DDL(Data Definition Language)
所谓的数据库对象,指的就是
数据库
、表
、视图
、存储过程
等等这些东西。当我们使用CREATE
、ALTER
、DROP
等语句去修改这些所谓的数据库对象时,就会隐式的提交前边语 -
隐式使用或修改
**mysql**
数据库中的表当我们使用ALTER USER
、CREATE USER
、DROP USER
、GRANT
、RENAME USER
、REVOKE
、SET PASSWORD
等语句时也会隐式的提交前边语句所属于的事务。 -
事务控制或关于锁定的语句当我们在一个事务还没提交或者回滚时就又使用
START TRANSACTION
或者BEGIN
语句开启了另一个事务时,会隐式的提交上一个事务,比如这样: -
加载数据的语句比如我们使用
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
等语句也会隐式的提交前边语句所属的事务。
保存点
可以不用ROLLBACK
回滚之前所有已经执行的sql,只需要会滚到savepoint
保存点上即可
SAVEPOINT 保存点名称;
当使用的时候:
ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称;
删除保存点:
RELEASE SAVEPOINT 保存点名称;
标签:语句,事务,数据库,START,提交,MySQL,隐式
From: https://www.cnblogs.com/smallwolf/p/17636768.html