mysql(8.0) 如何设置事务

语法

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
}

上面的transaction_characteristic指定了事务的相关特性,多个transaction_characteristic用逗号隔开。transaction_characteristic设置了事务的隔离级别和访问方式。对innodb中的表的操作行为会受到隔离级别的影响。访问模式指出事务操作是"读写模式"还是"只读模式"。

另外,SET TRANSACTION中还包含一个表明语句作用范围的关键字SESSIONGLOBAL

Transaction Isolation Levels

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

默认的隔离级别是REPEATABLE READ。一共有四种隔离级别,还包括READ COMMITTED, READ UNCOMMITTED, 和SERIALIZABLE

Transaction Access Mode

使用READ WRITEREAD ONLY设置事务访问模式,在SET TRANSACTION中不允许指定多个访问模式。

默认情况下,事务时READ WRITE模式,在事务中允许对数据库中的表进行读/写操作。

如果事务访问模式被设置为READ ONLY,禁止对数据库中的表进行修改。在这种模式下存储引擎性能有相应提高。

在"只读模式"下,可以使用DML(数据操作语言)修改用TMPORARY关键字创建的表。与永久表一样,不允许使用DDL(数据定义语言)语句对任何表进行更改。

"访问模式"也可以在开启事务(start transaction)的时候指定。

Transaction Characteristic Scope

你可以在当前会话,设置事务的全局属性,也可以只针对当前会话。

  • GLOBAL关键字
    • 作用全局,后面的所有会话都会受到影响。
    • 当前会话退出,修改仍然生效
  • SESSION关键字
    • 作用于当前会话,接下来的所有事务。
    • 事务中允许使用该语句,但不影响当前正在进行的事务。
    • 如果在事务之间执行该语句,将会覆盖之前的事务设置。
  • 既没有SESSION关键字也没有GLOBAL关键字
    • 当前语句只作用于当前会话的下一个事务。
    • 后面的会话(第二个会话开始)将会使用执行语句之前的配置。
    • 事务中不能执行该语句
mysql>
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> set transaction isolation level serializable;
ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progress

mysql> set session transaction isolation level serializable;
Query OK, 0 rows affected (0.09 sec)

修改全局事务属性,要求用户为CONNECTION ADMINSUPER权限。任何会话都可以修改它自己的事务特性(即使在会话过程中)。

在mysql服务启动时,可以使用--transaction-isolation=level命令行选项设置全局的隔离级别,也可以使用配置文件。level的可选值: READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, 和SERIALIZABLE

类似的,mysql服务器启动时,使用--transaction-read-only设置事务访问模式。默认是OFF(read/write模式),设为NO则为read only模式

举个例子,设置隔离级别为REPEATABLE READ访问模式为READ WRITE,把以下内容填入mysql配置文件的[mysqld]部分:

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

在运行期间,可以直接用SET TRANSACTION进行设置,我们也可以直接使用SET命令,给transaction_isolationtransaction_read_only这两个系统变量赋值:

  • SET TRANSACTION可以使用GLOBALSESSION这两个可选项,设置不同范围的事务特性。
  • SET命令也有相应的命令设置不同范围的事务特性。
    接下来的表格展示了相关事务特性设置的语法:

SET TRANSACTION语法

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

SET语法

Syntax Affected Characteristic Scope
SET GLOBAL var_name = value Global
SET @@GLOBAL.var_name = value Global
SET PERSIST var_name = value Global
SET @@PERSIST.var_name = value Global
SET PERSIST_ONLY var_name = value No runtime effect
SET @@PERSIST_ONLY.var_name = value No runtime effect
SET SESSION var_name = value Session
SET @@SESSION.var_name = value Session
SET var_name = value Session
SET @@var_name = value Next transaction only

你可能感兴趣的:(SQL,Mysql)