MySQL事务

ACID

原子性(Atomicity)

隔离性(Isolation)

一致性(consistency)

持久性(Durability)

当把现实世界的状态转换映射到数据库世界时,持久性意味着该转换对应的数据库操作所修改的数据都应该在磁盘上保留下来,不论之后发生了什么事故,本次转换造成的影响都不应该被丢失掉

事务 ​是一个概念,它对应着一个或者多个数据库的操作,事务分为以下几个状态:

  • 活动的

  • 部分提交

  • 失败的

  • 中止的

  • 提交的

image

MySQL中事务的语法

事务的本质其实只是一系列数据库操作,只不过这些数据库操作符合ACID特性而已

开启事务

  • BEGIN [work];

  • START TRANSACTION; 开启事务

    • READ ONLY 只读事务,只能读而不能写操作,如:START TRANSACTION READ ONLY;

    • WITH CONSISTANT SNAPSHOT 开启一致性读

    • 开启一个读写事务

      START TRANSACTION READ WRITE, WITH CONSISTENT SNAPSHOT

提交事务

  • COMMIT;

手动中止事务

  • ROLLBACK;

支持事务的存储引擎

目前只有InnoDBNDB存储引擎支持

自动提交

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)

    所谓的数据库对象,指的就是数据库视图存储过程等等这些东西。当我们使用CREATEALTERDROP等语句去修改这些所谓的数据库对象时,就会隐式的提交前边语

  • 隐式使用或修改**mysql**数据库中的表当我们使用ALTER USERCREATE USERDROP USERGRANTRENAME USERREVOKESET PASSWORD等语句时也会隐式的提交前边语句所属于的事务。

  • 事务控制或关于锁定的语句当我们在一个事务还没提交或者回滚时就又使用START TRANSACTION或者BEGIN语句开启了另一个事务时,会隐式的提交上一个事务,比如这样:

  • 加载数据的语句比如我们使用LOAD DATA语句来批量往数据库中导入数据时,也会隐式的提交前边语句所属的事务。

  • 关于**MySQL**复制的一些语句使用START SLAVESTOP SLAVERESET SLAVECHANGE MASTER TO等语句时也会隐式的提交前边语句所属的事务。

  • 其它的一些语句使用ANALYZE TABLECACHE INDEXCHECK TABLEFLUSHLOAD INDEX INTO CACHEOPTIMIZE TABLEREPAIR TABLERESET等语句也会隐式的提交前边语句所属的事务。

保存点

可以不用ROLLBACK回滚之前所有已经执行的sql,只需要会滚到savepoint保存点上即可

SAVEPOINT 保存点名称;

当使用的时候:

ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称;

删除保存点:

RELEASE SAVEPOINT 保存点名称;
posted @ 2023-08-17 09:31  松间明月447  阅读(8)  评论(0编辑  收藏  举报