数据库事物隔离级别
2015-11-17 09:54
681 查看
一、事务隔离级别
ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serializable)。
对于不同的事务,采用不同的隔离级别分别有不同的结果。不同的隔离级别有不同的现象。主要有下面3种现在:
1、脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。
2、非重复读(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,可能被更新了(update),也可能被删除了(delete)。
3、幻像读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入操作(insert)的事务提交,导致每次返回不同的结果集。
不同的隔离级别有不同的现象,并有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差,4种事务隔离级别分别表现的现象如下表:
二、数据库中的默认事务隔离级别
在Oracle中默认的事务隔离级别是提交读(read committed)。
对于MySQL的Innodb的默认事务隔离级别是重复读(repeatable read)。可以通过下面的命令查看:
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+———————–+—————–+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+———————–+—————–+
| REPEATABLE-READ | REPEATABLE-READ |
+———————–+—————–+
1 row in set (0.00 sec)
下面进行一下测试:
ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serializable)。
对于不同的事务,采用不同的隔离级别分别有不同的结果。不同的隔离级别有不同的现象。主要有下面3种现在:
1、脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。
2、非重复读(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,可能被更新了(update),也可能被删除了(delete)。
3、幻像读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入操作(insert)的事务提交,导致每次返回不同的结果集。
不同的隔离级别有不同的现象,并有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差,4种事务隔离级别分别表现的现象如下表:
隔离级别 | 脏读 | 非重复读 | 幻像读 |
read uncommitted | 允许 | 允许 | 允许 |
read committed | 允许 | 允许 | |
repeatable read | 允许 | ||
serializable |
在Oracle中默认的事务隔离级别是提交读(read committed)。
对于MySQL的Innodb的默认事务隔离级别是重复读(repeatable read)。可以通过下面的命令查看:
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+———————–+—————–+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+———————–+—————–+
| REPEATABLE-READ | REPEATABLE-READ |
+———————–+—————–+
1 row in set (0.00 sec)
下面进行一下测试:
Time | Session 1 | Session 2 |
T1 | set autocommit=0; | set autocommit=0; |
T2 | mysql> select * from tmp_test; +——+———+ | id | version | +——+———+ | 1 | 1 | +——+———+ 1 row in set (0.00 sec) | |
T3 | mysql> update tmp_test set version=2 where id=1; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from tmp_test; +——+———+ | id | version | +——+———+ | 1 | 2 | +——+———+ 1 row in set (0.00 sec) | |
T4 | mysql> select * from tmp_test; +——+———+ | id | version | +——+———+ | 1 | 1 | +——+———+ 1 row in set (0.00 sec) 【说明】 Session 2未提交,看到数据不变,无脏读。 | |
T5 | commit; | |
T6 | mysql> select * from tmp_test; +——+———+ | id | version | +——+———+ | 1 | 1 | +——+———+ 1 row in set (0.00 sec) 【说明】 Session 2已经提交,还是看到数据不变,即可以重复读。 | |
T7 | commit; | |
T8 | mysql> select * from tmp_test; +——+———+ | id | version | +——+———+ | 1 | 2 | +——+———+ 1 row in set (0.00 sec) 【说明】 提交事务,看到最新数据。 | |
T9 | mysql> insert into tmp_test values(2,1); Query OK, 1 row affected (0.00 sec) mysql> select * from tmp_test; +——+———+ | id | version | +——+———+ | 1 | 2 | | 2 | 1 | +——+———+ 2 rows in set (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) | |
T10 | mysql> select * from tmp_test; +——+———+ | id | version | +——+———+ | 1 | 2 | +——+———+ 1 row in set (0.00 sec) 【说明】 Session 2的insert事务已经提交,看到的数据和T8的时候一样,即未发生幻象读。 | |
T11 | mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from tmp_test; +——+———+ | id | version | +——+———+ | 1 | 2 | | 2 | 1 | +——+———+ 2 rows in set (0.00 sec) 【说明】 事务提交,看到最新数据。 | |
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马
- Oracle 手动创建数据库步骤详解
- 分割超大Redis数据库例子