MySQL-事务操作

自动提交

在InnoDB中,所有来自用户的活动都发生在指定用户的事务中,如果autocommit自动提交事务的模式打开,每个SQL语句都形成一个SQL自身的单一事务。默认地,MySQL为每个连接启动一个新的自动提交事务的会话,对会话中的每个SQL语句提交一次事务,如果执行SQL语句的过程中发生异常,则根据异常类型执行回滚操作,如何执行回滚操作的场景分类如下所示,有时候InnoDB只回滚失败的SQL语句,有时候回滚整个事务内的SQL语句:

  • 如果事务的提交引起表空间的总容量超出了限制值,则MySQL发生数据表被填满的错误,然后InnoDB回滚该SQL语句
  • 事务发生deadlocks,则InnoDB回滚整个事务,当该场景出现的时候,InnoDB将重试提交该事务。 一个锁的超时会引起InnoDB回滚当前的语句(语句执行时需要等待获取锁,等待超时),用户可以使用–innodb-rollback-on-timeout属性设置超时执行回滚操作,该配置属性在MySQL服务器启动时生效,如果使用该配置属性,InnoDB在语句执行超时的情况下重试提交对应的事务。 在实际的繁忙的运行环境中,deadlocks与等待锁超时是常见的现象,业务应用需要提前意识到这些异常情况并做出重试提交事务的对策,例如,在业务处理的时候,尽可能降低每次事务处理的数据行,从而降低事务处理的时间,因而,等待锁的时间也会降低,在应用层面上,用户可以将业务分割成合适的颗粒度作为合适的工作单元处理
  • 如果用户没有在语句中指定忽略选项,重复键的错误回滚对应的SQl语句
  • 行记录的长度太长错误回滚对应的SQL语句
  • 在MySQL的服务器层(非InnoDB的存储引擎层)发生的错误也会引发事务的回滚,在单个SQL语句回滚的过程中锁没有被释放

显式地使用START TRANSACTION或者BEGIN语句开始一个事务支持多个语句的功能,以COMMIT或者ROLLBACK语句结束事务。

设置autocommit属性等于0是关闭自动提交事务的功能,此时,会话中总是开启着一个事务,使用COMMIT或者ROLLBACK语句结束当前的事务同时也开启一个新的事务。

如果一个自动提交事务功能关闭的会话,在没有显式地提交最后事务的情况下结束,则MySQL默认地回滚对应的事务。

提交

如前面所述,InnoDB使用COMMIT显式地提交事务,InnoDB存在很多隐式地提交事务的语句,如下所示:

数据定义语言

ALTER EVENT, ALTER FUNCTION, ALTER PROCEDURE, ALTER SERVER, ALTER TABLE, ALTER TABLESPACE, ALTER VIEW, CREATE DATABASE, CREATE EVENT, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE ROLE, CREATE SERVER, CREATE SPATIAL REFERENCE SYSTEM, CREATE TABLE, CREATE TABLESPACE, CREATE TRIGGER, CREATE VIEW, DROP DATABASE, DROP EVENT, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP ROLE, DROP SERVER, DROP SPATIAL REFERENCE SYSTEM, DROP TABLE, DROP TABLESPACE, DROP TRIGGER, DROP VIEW, INSTALL PLUGIN, RENAME TABLE, TRUNCATE TABLE, UNINSTALL PLUGIN.

修改数据表

ALTER USER, CREATE USER, DROP USER, GRANT, RENAME USER, REVOKE, SET PASSWORD

事务控制与锁语句

BEGIN, LOCK TABLES, SET autocommit = 1, START TRANSACTION, UNLOCK TABLES.

UNLOCK TABLES

数据加载语句

LOAD DATA. LOAD DATA

管理语句

ANALYZE TABLE, CACHE INDEX, CHECK TABLE, FLUSH, LOAD INDEX INTO CACHE, OPTIMIZE TABLE, REPAIR TABLE, RESET

复制控制语句

START REPLICA, STOP REPLICA, RESET REPLICA, CHANGE REPLICATION SOURCE TO, CHANGE MASTER TO

回滚

回滚语句是取消当前事务做出的修改,COMMIT事务提交语句与ROLLBACK语句释放所有当前事务中设置的锁。

分组事务操作

如前面所述,当AUTOCOMMIT自动提交事务的功能开启,则MySQL自动地为每个SQL语句生成一个新的事务,并提交每个SQL语句的事务。如下所示,在不同的事务提交方式的情况下,如何在一个事务中执行多个SQL语句:

MySQL-事务操作

Original: https://blog.csdn.net/uesowys/article/details/127815413
Author: uesowys
Title: MySQL-事务操作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/653157/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球