您的位置:首页 > 数据库

数据库事物隔离级别

2010-08-18 13:58 260 查看
这个想必每个程序员都很早就知道了,但是我其实并没有真正搞清楚。网络上的很多文章也没说清楚。以下内容个人觉得还是比较好理解的:

事务隔离级别(transaction isolation
levels
):隔离级别就是对对事务并发控制的等级。ANSI
/

ISO
SQL
将其分为串行化(SERIALIZABLE)、可重复读(REPEATABLE
READ)、读已提交(READ COMMITED)、读未提交(READ
UNCOMMITED)四个等级。为了实现隔离级别通常数据库采用锁(Lock)。一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。首先介绍四种等级,然后举例解释后面三个等级(可重复读、读已提交、读未提交)中会出现的并发问题。

串行化(SERIALIZABLE):所有事务都一个接一个地串行执行,这样可以避免幻读(phantom
reads)。对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range
lock)。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。

可重复读(REPEATABLE
READ):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。

读已提交(READ
COMMITED):被读取的数据可以被其他事务修改。这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL
Server默认的隔离等级。

读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(Dirty
Read)。

综上述,可以等到下面的表格:

隔离等级

脏读

不可重复读

幻读

读未提交

YES

YES

YES

读已提交

NO

YES

YES

可重复读

NO

NO

YES

串行化

NO

NO

NO

注:事物隔离级别是依据一个事物进行查询(Select,可能是一次或多次)时的数据是否“正确”为依据而定义的。(理解)

补充:

1、脏读:事物一读到了事物二尚未提交的数据(如果事物二失败回滚的情况下,则事物一读到的数据则是无效的,或者说垃圾)

产生级别:读未提交

解决需要级别: 读已提交

2、不可重复读:事物一在二次或多次读取数据时,读到了不同的数据。原因是事物二在中间修改了其中的数据。

产生级别:读已提交

解决需要级别: 可重复读

3、幻读: 事物一修改了部分数据,事物二添加了新的并且符合事物一的条件的数据。造成事物一发现有新的数据没有修改,称幻觉。

产生级别: 可重复读

解决需要级别:串行化

各大数据库默认隔离级别:

Oracle:Read Committed

SQL Server:Read Committed

MySql:( InnoDB ) Repeatable Read
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: