• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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可以包含可选GLOBALSESSION关键字来指示语句的范围。

    • 交易隔离级别
    • 交易访问模式
    • 交易特征范围

    交易隔离级别

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

    默认隔离级别为REPEATABLE READ。其他允许值是READ COMMITTEDREAD UNCOMMITTEDSERIALIZABLE。有关这些隔离级别的信息,请参见“事务隔离级别”。

    交易访问模式

    要设置事务访问模式,请使用READ WRITEor READ ONLY子句。不允许在同SET TRANSACTION一条语句中指定多个访问模式子句。

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

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

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

    READ WRITEREAD ONLY接入方式也可以使用一个独立的事务中指定START TRANSACTION的语句。

    交易特征范围

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

    • 使用GLOBAL关键字:

      • 该声明适用于所有后续会话。
      • 现有会话不受影响。
    • 使用SESSION关键字:

      • 该声明适用于当前会话内执行的所有后续事务。
      • 该语句在事务中是允许的,但不会影响当前正在进行的事务。
      • 如果在事务之间执行,则该语句将覆盖设置命名特征的next-transaction值的任何在前语句。
    • 在没有任何SESSIONGLOBAL关键字:

      • 该语句仅适用于会话中执行的下一个单个事务。
      • 随后的事务将恢复为使用命名特征的会话值。
      • 该声明在交易中是不允许的:

        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
        

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

    要在服务器启动时设置全局隔离级别,请在命令行或选项文件中使用该选项。值此选项使用破折号,而不是空间,所以允许值是,,,或。--transaction-isolation=levellevelREAD-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE

    同样,要在服务器启动时设置全局事务访问模式,请使用该--transaction-read-only选项。默认值为OFF(读/写模式),但可以将值设置ON为只读模式。

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

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

    在运行时,可以使用该SET TRANSACTION语句间接设置全局,会话和下一个事务作用域级别的特征,如前所述。也可以使用以下SET语句直接设置它们,以将值分配给transaction_isolationtransaction_read_only系统变量:

    • SET TRANSACTION允许使用可选GLOBALSESSION关键字来设置不同作用域级别的事务特征。
    • SET用于为transaction_isolation和和transaction_read_only系统变量分配值的语句具有用于在不同作用域级别设置这些变量的语法。

    下表显示了每种SET TRANSACTION和变量分配语法设置的特征作用域级别。

    事务特征的SET TRANSACTION语法

    句法受影响的特征范围
    SET GLOBAL TRANSACTION transaction_characteristicGlobal
    SET SESSION TRANSACTION transaction_characteristicSession
    SET TRANSACTION transaction_characteristic仅下一笔交易

    交易特征的SET语法

    句法受影响的特征范围
    SET GLOBAL var_name= valueGlobal
    SET @@GLOBAL.var_name= valueGlobal
    SET PERSIST var_name= valueGlobal
    SET @@PERSIST.var_name= valueGlobal
    SET PERSIST_ONLY var_name= value没有运行时效果
    SET @@PERSIST_ONLY.var_name= value没有运行时效果
    SET SESSION var_name= valueSession
    SET @@SESSION.var_name= valueSession
    SET var_name= valueSession
    SET @@var_name= value仅下一笔交易

    可以在运行时检查事务特征的全局和会话值:

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