SQL Server的四种事务隔离级别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简明扼要说明SQL Server的四种事务隔离级别
解决数据库并发读取错乱的途径之一就是使用事务进行操作,并且设置相应的事务隔离级别,现在就解释一下SQL Server的四种隔离级别。
SQL Server的四种隔离级别知识点整理,特别制作了流程图,方便以后查看!
SET TRANSACTION ISOLATION LEVEL
{
READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
一、未提交读READ UNCOMMITTED(脏读)
意义:包含未提交数据的读。例如,在多用户环境下,用户B更改了某行。用户A在用户B 提交更改之前读取已更改的行。如果此时用户B再回滚更改,则用户A便读取了逻辑上从未存在过的行。
1)用户B:
BEGIN TRAN
UPDATE test SET age=25 WHERE name = ‘AA’
2)用户A:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED(此句不写即默认为READ COMMITTED模式)
SELECT * FROM test(此时将查到AA的age值为25)
3)用户B:
ROLLBACK(此时撤消了步骤1的UPDATE操作,则用户A读到的错误数据被称为脏读)二、提交读(READ COMMITTED)
意义:指定在读取数据时控制共享锁以避免脏读。此隔离等级的主要作用是避免脏读。
演示:
1)用户B:
BEGIN TRAN
UPDATE test SET age=25 W HERE name = ‘AA’
2)用户A:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM test (上句设置了提交读模式,则此时将会查不到数据,显示查询等待中,直到用户B进行了ROLLBACK或者COMMIT操作后,此语句才会生效)
三、不一致的分析REPEATABLE READ(重复读)
意义:在多用户环境下,用户A开了一个事务,并且先对test表的某条记录做了查询(select * from test where name = ‘AA’),接着用户B对test表做了更新并提交(update test set age=25 where name=’AA’),这时A再去查test表中的这条记录,第一次读到的age值为12,第二次为25,两次读到的数据不一样,称之为重复读。
解决办法:
在用户A的事务运行之前,先设定SQL的隔离等级为REPEATABLE READ
SQL语句为SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
这样在上图第一步中,用户A查询完之后,用户B将无法更新用户A所查询到的数据集中
的任何数据(但是可以更新、插入和删除用户A查询到的数据集之外的数据),直到用户A 事务结束才可以进行更新,这样就有效的防止了用户在同一个事务中读取到不一致的数据。
四、幻象(SERIALIZABLE)
意义:在多用户环境下,用户A开启了一个事务,并查询test表中的所有记录,然后用户B 在自己的事务中插入(或删除)了test表中的一条记录并提交事务,此时用户A再去执行前面的查询整张表记录的操作,结果会多出(少了)一条记录,此操作称之为幻象。
解决办法:
在用户A的事务运行之前,先设定SQL的隔离等级为SERIALIZABLE
语句为SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
这样在用户A的事务执行过程中,别的用户都将无法对任何数据进行更新、插入和删除的操作,直到用户A的事务回滚或者提交为止。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。