输入banner图图片脚本导航/分类

老男孩MySQL笔记 第二天2-2

级别的方法

 

事务具有ACID四种特性。

但是Isolation并发可能引起如下问题:

1.脏读

允许读取到未提交的脏数据。

2.不可重复读

如果你在时间点T1读取了一些记录,在T2时再想重新读取一次同样的这些记录时,这些记录可能已经被改变、或者消失不见。

3.幻读

解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

 

由ANSI/ISO定义的SQL-92标准定义的四种隔离级别

1.Read Uncommitted

2.Read Committed

3.Repeatable Read

4.Serializable

 

隔离解别

脏读

不可重复读

幻读

Read Uncommitted

Y

Y

Y

Read Committed

N

Y

Y

Repeatable(default)

N

N

Y

Serializable

N

N

N

 

下面用Mysql数据库做一些小实验

 

 

方法1:

 

用户可以用SET TRANSACTION语句改变单个会话或者所有新进连接的隔离级别。它的语法如下:

SET [SESSION | GLOBAL] TRANSACTIONISOLATION LEVEL{READ UNCOMMITTED| READ COMMITTED | REPEATABLE READ| SERIALIZABLE}

注意:默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局对从那点开始创建的所有新连接(除了不存在的连接)设置默认事务级别。你需要SUPER权限来做这个。使用SESSION关键字为将来在当前连接上执行的事务设置默认事务级别。任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别。 你可以用下列语句查询全局和会话事务隔离级别:

SELECT @@global.tx_isolation;

SELECT @@session.tx_isolation;

SELECT @@tx_isolation;

网上有人使用set tx_isolation命令:

mysql> settx_isolation=‘read-committed‘;Query OK, 0 rows affected (0.00sec)+----------------+| @@tx_isolation |+----------------+| READ-COMMITTED|+----------------+1 row in set (0.00 sec)

mysql> select@@session.tx_isolation;+------------------------+| @@session.tx_isolation|+------------------------+|READ-COMMITTED        |+------------------------+1 row in set (0.00 sec)事务隔离变了。网上还有人这样写set @@tx_isolation命令,但这个命令是有问题的。

mysql>  set @@tx_isolation=‘read-committed‘;QueryOK, 0 rows affected (0.00 sec)

mysql> select@@session.tx_isolation;+------------------------+| @@session.tx_isolation|+------------------------+| REPEATABLE-READ       |+------------------------+1 row in set (0.00 sec)

mysql> select @@tx_isolation;+-----------------+|@@tx_isolation  |+-----------------+| REPEATABLE-READ |+-----------------+1row in set (0.00 sec)session事物的隔离级别并没有改变。

 

 

方法2:

 [sql]viewplaincopy

 

1.       mysql> select version();  

2.       +------------+  

3.       | version()  |  

4.       +------------+  

5.       | 5.1.52-log |  

6.       +------------+  

7.       1 row in set (0.00 sec)  

 

 

查看InnoDB存储引擎系统级的隔离级别和会话级的隔离级别

[sql]viewplaincopy

 

1.       mysql> select @@global.tx_isolation,@@tx_isolation;  

2.       +-----------------------+-----------------+  

3.       | @@global.tx_isolation | @@tx_isolation  |  

4.       +-----------------------+-----------------+  

5.       | REPEATABLE-READ       | REPEATABLE-READ |  

6.       +-----------------------+-----------------+  

7.       1 row in set (0.00 sec)  

 

更改会话级的隔离级别

 

[sql]viewplaincopy

 

1.       Session 1:  

2.       mysql> set session tx_isolation=‘read-uncommitted‘;  

3.       Query OK, 0 rows affected (0.00 sec)  

4.       mysql> select @@global.tx_isolation,@@tx_isolation;  

5.       +-----------------------+------------------+  

6.       | @@global.tx_isolation | @@tx_isolation   |  

7.       +-----------------------+------------------+  

8.       | REPEATABLE-READ       | READ-UNCOMMITTED |  

9.       +-----------------------+------------------+  

10.     1 row in set (0.00 sec)  

11.       

12.       

13.     Session 2:  

14.     mysql> select @@global.tx_isolation, @@tx_isolation;  

15.     +-----------------------+-----------------+  

16.     | @@global.tx_isolation | @@tx_isolation  |  

17.     +-----------------------+-----------------+  

18.     | REPEATABLE-READ       | REPEATABLE-READ |  

19.     +-----------------------+-----------------+  

20.     1 row in set (0.00 sec)  

 

更改系统级的隔离级别

 

 

[sql]viewplaincopy

 

1.       Session 1:  

2.       mysql> set global tx_isolation=‘read-uncommitted‘;  

3.       Query OK, 0 rows affected (0.00 sec)  

4.       mysql> select @@global.tx_isolation,@@tx_isolation;  

5.       +-----------------------+------------------+  

6.       | @@global.tx_isolation | @@tx_isolation   |  

7.       +-----------------------+------------------+  

8.       | READ-UNCOMMITTED      | READ-UNCOMMITTED |  

9.       +-----------------------+------------------+  

10.     1 row in set (0.00 sec)  

11.       

12.     Session 2:  

13.     mysql> select @@global.tx_isolation, @@tx_isolation;  

14.     +-----------------------+-----------------+  

15.     | @@global.tx_isolation | @@tx_isolation  |  

16.     +-----------------------+-----------------+  

17.     | READ-UNCOMMITTED      | REPEATABLE-READ |  

18.     +-----------------------+-----------------+  

19.     1 row in set (0.00 sec)  

 

关闭SQL语句的自动提交

 

[sql]viewplaincopy

 

1.       mysql> set autocommit=off;  

2.       Query OK, 0 rows affected (0.00 sec)  

 

查看SQL语句自动提交是否关闭

 

[plain]viewplaincopy

 

1.       mysql> show variables like ‘autocommit‘;  

2.       +---------------+-------+  

3.       | Variable_name | Value |  

4.       +---------------+-------+  

5.       | autocommit    | OFF   |  

6.       +---------------+-------+  

7.       1 row in set (0.00 sec)