SQLserver 锁和事务隔离级别的比较与使用
对象
① 锁:每条 SQL语句
② 隔离:事务
锁
①
并发问题
丢失更新
未确认的读取(脏读)
不一致的分析(非重复读):多次读取相同的数据(行)不一致(其他用户更改 update )
幻像读:多次读取有不存在和新增的数据(其他用户插入 insert 或删除 delete )
隔离级别
隔离级别 脏读 不可重复读取 幻像 说明
未提交读 (read uncommitted) 是 是 是 如果其他事务更新,不管是否提交,立即执行
提交读 (read committed 默认 ) 否 是 是 读取提交过的数据。如果其他事务更新没提交,则等待
可重复读 (repeatable read) 否 否 是 查询期间,不允许其他事务 update
可串行读 (serializable) 否 否 否 查询期间,不允许其他事务 insert 或 delete
提交读
假设存在表 A,如下所示
A1 A2 A3
11 21 31
12 22 32
打开查询分析器并打开两个连接,分别输入如下两个事务:
-- 事务Ⅰ
SET TRANSACTION ISOLATION LEVEL READ Committed
begin tran
update A set A2 = 20 where A1 = 11
waitfor delay '00:00:10'
rollback tran
-- 事务Ⅱ
SET TRANSACTION ISOLATION LEVEL READ Committed
select * from A where A1 = 11
如果先运行事务Ⅰ,然后紧接着运行事务Ⅱ,则事务Ⅱ要等待 10 秒钟(
一个连接在修改数据块时别的连接也不
能查询这个数据块,直到解 锁。反之亦然:读的时候不能写和修改
)。
如果把事务Ⅱ改为如下
SET TRANSACTION ISOLATION LEVEL READ UNCommitted
select * from A where A1 = 11
那么事务Ⅱ不需等待,立即执行(
可以看出 READ UNCommitted事务 select 不对数据发出共享 锁
)
锁: ( 这里主要讲解 共享锁 和 排他锁 两种经常用到的锁 )
共享 锁主要是为了共享读( select ),如果存在事务(一个或多个)拥有对表中数据(关于 锁数据的
多少,视 锁的粒度而定)的共享 锁,不允许对 锁定的数据进行更新 (update) (从 锁的角度讲,即不允许事
务获取排他 锁 ,要等到所有的共享 锁都释放掉)。反之,如果事务对数据已经具有排他 锁(只能有一个),
其他的事务就不能对 锁定的数据获取共享 锁和排他 锁(即排他 锁与共享 锁不能兼容,更多信息请查看 锁兼