隔离级别参数transaction_isolation
- 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
- 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
- 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
- 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
read-uncommitted:读未提交,允许脏读;
read-committed:读提交,不允许脏读,但允许不可重复读;
repeatable-read:可重复读,不允许脏读、不可重复读,但允许幻读;???
serializable:串行化,以上都不允许。
该参数在 mysql 命令行直接动态修改时使用的参数名称是tx_isolation='repeatable-read',必须有中杠连接并带有引号。
该参数在 my.cnf 的[mysqld]标签下使用的参数名称是transaction_isolation=repeatable-read,必须有中杠连接,引号可有可无。
该参数也可以使用类似语句 set transaction isolation levelrepeatable read;来间接修改,且不带中杠也不带引号,隔离级别关键字之间是使用空格隔开。
动态修改隔离级别时,带 global 关键字的语句表示对后来的会话生效,对当前会话不生效,带 session 关键字的语句表示立即对当前会话生效,不带 global 和 session 关键字的表示对当前会话的下一个事务或者说下一个请求生效。注意:使用 begin 或start transaction 语句显式开启一个事务之后,不能在活跃的事务内更改隔离级别。这些关键字的作用范围与修改配置参数时效果是一样的。
全局,会话,动态变量,枚举类型,默认值为 repeatable-read。
注意:该参数有个比较尴尬的地方,即在 my.cnf 中只能写作transaction_isolation(这个是 mysqld 的启动选项,但非server system variables),不能写成 tx_isolation(这个是server system variables 但非启动选项),但是在命令行中只能使用 tx_isolation,不能使用 transaction_isolation。
0 --> 读未提交 (READ-UNCOMMITTED)
1 --> 读已提交 (READ-COMMITTED)
2 --> 可重复读 (REPEATABLE-READ)
3 --> 序列化 (SERIALIZABLE)
设置隔离级别的方法是:
SET [SESSION|GLOBAL] transaction_isolation=[0|1|2|3];
查看隔离级别的方法是:
SHOW [GLOBAL] VARIABLES LIKE 'transaction_isolation';