设置事务SET TRANSACTION

 

复制代码
SET [GLOBAL | SESSION] TRANSACTION
    transaction_characteristic [, transaction_characteristic] ...

transaction_characteristic: {
    ISOLATION LEVEL level
  | access_mode
}

level: {
     REPEATABLE READ
   | READ COMMITTED
   | READ UNCOMMITTED
   | SERIALIZABLE
}

access_mode: {
     READ WRITE
   | READ ONLY
}
复制代码

该语句指定事务特征。它采用由逗号分隔的一个或多个特征值的列表。每个特征值都设置事务隔离级别或访问模式。隔离级别用于对InnoDB进行操作访问模式指定事务是以读/写还是只读模式运行。

另外,SET TRANSACTION可以包含可选GLOBAL或 SESSION关键字来指示语句的范围。

隔离级别

要设置事务隔离级别,请使用一个ISOLATION LEVEL level子句。不允许在同一SET TRANSACTION语句中指定多个子句。

默认隔离级别为 REPEATABLE READ其他允许值是READ COMMITTEDREAD UNCOMMITTED和 SERIALIZABLE

访问模式

请使用READ WRITE or  READ ONLY子句。不允许在同SET TRANSACTION一条语句中指定多个访问模式子句

 

默认情况下,事务以读/写模式进行,并且允许对事务中使用的表进行读写。可以使用SET TRANSACTION的访问模式明确指定此模式 READ WRITE

如果事务访问模式设置为READ ONLY,则禁止更改表。这可以使存储引擎能够进行性能改进,这在不允许写入的情况下是可能的。

在只读模式下,仍然可以使用DML语句更改用关键字TEMPORARY创建的表。与永久表一样,不允许使用DDL语句进行更改。

特征范围

您可以为当前会话或仅针对下一个事务全局设置事务特征:

使用GLOBAL关键字:

  • 该声明适用于所有后续会话。

  • 现有会话不受影响。

使用SESSION关键字:

  • 该声明适用于当前会话中执行的所有后续事务。

  • 该语句在事务中是允许的,但不会影响当前正在进行的事务。

  • 如果在事务之间执行,则会覆盖任何前面语句设置的下个事务名特征值

 

在没有任何SESSION或 GLOBAL关键字:

  • 该语句仅适用于会话中执行的下一个单个事务。

  • 随后的事务将恢复为使用命名特征的会话值。

  • 该声明在事务中是不允许的:

 

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.02 sec)

mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
ERROR 1568 (25001): Transaction characteristics can't be changed
while a transaction is in progress

更改全局事务特征需要 SUPER特权。任何会话都可以自由更改其会话特征(即使在事务中间),也可以更改其下一个事务的特征(在该事务开始之前)。

 

例如,要将隔离级别设置为REPEATABLE READ,将访问模式设置为READ WRITE,请在[mysqld]选项文件部分中使用以下几 

[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF

 

Table 13.6 SET TRANSACTION Syntax for Transaction Characteristics

SyntaxAffected Characteristic Scope
SET GLOBAL TRANSACTION transaction_characteristic Global
SET SESSION TRANSACTION transaction_characteristic Session
SET TRANSACTION transaction_characteristic Next transaction only

 

Table 13.7 SET Syntax for Transaction Characteristics

SyntaxAffected Characteristic Scope
SET GLOBAL var_name = value Global
SET @@GLOBAL.var_name = value Global
SET SESSION var_name = value Session
SET @@SESSION.var_name = value Session
SET var_name = value Session
SET @@var_name = value Next transaction only
 

It is possible to check the global and session values of transaction characteristics at runtime:

SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;

 

posted @   wongchaofan  阅读(499)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示