ITPub博客

首页 > 数据库 > MySQL > MySQL入门--事务控制语句

MySQL入门--事务控制语句

MySQL 作者:panpong 时间:2019-05-28 08:58:12 0 删除 编辑

事务 SQL 控制语句

MySQL 事务遵从 ACID :

• Atomic (原子性):所有语句作为一个单元全部成功执行或全部取消。

• Consistent (一致性):如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。

• Isolated (隔离性):事务之间不相互影响。

• Durable (持久性):事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失

1) 事务 SQL 控制语句

• START TRANSACTION (或 BEGIN ):显式开始一个新事务

• SAVEPOINT :分配事务过程中的一个位置,以供将来引用

• COMMIT :永久记录当前事务所做的更改

• ROLLBACK :取消当前事务所做的更改

• ROLLBACK TO SAVEPOINT :取消在 savepoint 之后执行的更改

• RELEASE SAVEPOINT :删除 savepoint 标识符

• SET AUTOCOMMIT :为当前连接禁用或启用默认 autocommit 模式

2) AUTOCOMMIT 模式

如何设置 AUTOCOMMIT 模式决定了如何以及何时开始新事务。默认情况下, AUTOCOMMIT 处于全局启用状态,这意味着会强制每个 SQL 语句隐式开始一个新事务。可以通过一个选项文件全局禁用 AUTOCOMMIT ,也可以通过设置 autocommit 变量为每个会话禁用它。启用 AUTOCOMMIT 会限制每个语句,并进而影响其自身事务中的事务表。这样可以有效地防止在一个事务中执行多个语句。这意味着,您将无法通过 COMMIT 或 ROLLBACK 作为一个单元提交或回滚多个语句。有时,会将这种情况误认为根本没有事务。但是,情况并非如此。启用 AUTOCOMMIT 后,每个语句仍会以原子方式执行。例如,通过在插入多个行时比较违反约束限制的效果,便可看出启用 AUTOCOMMIT 和根本不具有事务之间的差别。在非事务表(如 MyISAM )中,一旦发生错误,语句就会终止,已经插入的行会保留在该表中。而对于 InnoDB 表,已经插入的所有行都会从该表中删除,从而不会产生任何实际影响。

AUTOCOMMIT 确定开始新事务的方式和时间;默认情况下, AUTOCOMMIT 模式处于启用状态:作为一个事务隐式提交每个语句;

在 my.cnf 中将 AUTOCOMMIT 模式设置为 0 ,或者 SET GLOBAL AUTOCOMMIT=0;SET SESSION AUTOCOMMIT=0; SET @@AUTOCOMMIT :=0; 则禁用 AUTOCOMMIT ,事务会跨越多个语句,需要使用 COMMIT 或 ROLLBACK 结束事务;

使用 SELECT 检查 AUTOCOMMIT 设置:

SELECT @@AUTOCOMMIT;

3) 隐式提交

COMMIT 语句始终会 显式提交 当前事务。其他事务控制语句(例如,本幻灯片列出的语句)还具有隐式提交当前事务的作用。除了这些事务控制语句之外,其他类型的语句可能也具有隐式提交并进而终止)当前事务的作用。这些语句的行为就像在执行实际语句之前发出 COMMIT 一样。此外,这些语句本身并非事务语句,也就是说,如果成功,则无法回滚。通常,数据定义语句、据访问和用户管理语句以及锁定语句具有这种效果。

注:有很多例外情况,而且这些语句并非都能在所有版本的服务器上导致隐式提交。但是,建议将所有非 DML 语句都视为可导致隐式提交。有关导致隐式提交的完整语句列表,请参阅《 MySQL 参考手册》: http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html

隐式提交 会终止当前事务。用于隐式提交的 SQL 语句:

l   START TRANSACTION

l   SET AUTOCOMMIT = 1

导致提交的非事务语句:

l   数据定义语句( ALTER 、 CREATE 和 DROP )

l   管理语句( GRANT 、 REVOKE 和 SET PASSWORD )

l   锁定语句( LOCK TABLES 和 UNLOCK TABLES )

导致隐式提交的语句示例:

Mysql>TRUNCATE TABLE

Mysql>LOAD DATA INFILE

4) 事务存储引擎

使用 SHOW ENGINES 列出引擎特征:

mysql> SHOW ENGINES\G

********************* 2. row *********************

Engine: InnoDB

Support: DEFAULT

Comment: Supports transactions, row-level locking,

and foreign keys

Transactions: YES

XA: YES

Savepoints: YES

********************* 1. row *********************

Engine: MyISAM

Support: YES

Comment: MyISAM storage engine

Transactions: NO

XA: NO

Savepoints: NO

...

要确保事务存储引擎已编译到 MySQL 服务器中,并且可以在运行时使用,可使用 SHOW ENGINES 语句。 Support 列中的值为 YES 或 NO ,用于指示该引擎是否可以使用。如果该值为 DISABLED 则表示该引擎存在,但已关闭。值 DEFAULT 用于指示服务器在默认情况下使用的存储引擎。指定为 DEFAULT 的引擎应视为可用。 Transactions 、 XA 和 Savepoints 列用于指示该存储引擎是否支持这些功能。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/16976507/viewspace-2645832/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: MySQL入门--表维护
请登录后发表评论 登录
全部评论
数据库工程师,熟悉Oracle,Postgresql,MySQL等主流关系型数据库运维,调优,一直活跃在运维一线。了解Python,Django,简单自动化运维系统开发。

注册时间:2009-03-06

  • 博文量
    142
  • 访问量
    392350