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
中还包含一个表明语句作用范围的关键字SESSION
和GLOBAL
使用ISOLATION LEVEL level
语句设置事务隔离级别。在SET TRANSACTION
中不允许指定多个ISOLATION LEVEL
。
默认的隔离级别是REPEATABLE READ
。一共有四种隔离级别,还包括READ COMMITTED
, READ UNCOMMITTED
, 和SERIALIZABLE
。
使用READ WRITE
或READ ONLY
设置事务访问模式,在SET TRANSACTION
中不允许指定多个访问模式。
默认情况下,事务时READ WRITE
模式,在事务中允许对数据库中的表进行读/写操作。
如果事务访问模式被设置为READ ONLY
,禁止对数据库中的表进行修改。在这种模式下存储引擎性能有相应提高。
在"只读模式"下,可以使用DML
(数据操作语言)修改用TMPORARY
关键字创建的表。与永久表一样,不允许使用DDL
(数据定义语言)语句对任何表进行更改。
"访问模式"也可以在开启事务(start transaction
)的时候指定。
你可以在当前会话,设置事务的全局属性,也可以只针对当前会话。
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 ADMIN
或SUPER
权限。任何会话都可以修改它自己的事务特性(即使在会话过程中)。
在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_isolation
和transaction_read_only
这两个系统变量赋值:
SET TRANSACTION
可以使用GLOBAL
和SESSION
这两个可选项,设置不同范围的事务特性。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 |