Gen*_*нин 1 t-sql sql-server transactions nonblocking database-locking
拥有由脚本[1]定义的表,我在SSMS的2个窗口中执行脚本
--1) first in first SSMS window
set transaction isolation level READ UNCOMMITTED;
begin transaction;
update aaa set Name ='bbb'
where id=1;
-- results in "(1 row(s) affected)"
--rollback
Run Code Online (Sandbox Code Playgroud)
之后1)
--2)after launching 1)
select * from aaa --deleted comments
where id<>1
--is blocked
Run Code Online (Sandbox Code Playgroud)
独立于1)窗口中的事务隔离级别,2)中的SELECT被阻止.
为什么?
UPDATE的隔离级别是否会对其他事务的语句产生任何影响?
最高隔离级别是2)中的默认READ COMMITTED.
没有范围锁被归因,SELECT应该遭受COMMITTED READS(NONREPEATABLE READs)和PHANTOM READS(可重复读取)问题[2]
如何让它受到影响?
如何在不阻塞SELECT的情况下进行UPDATE?
[1]
CREATE TABLE aaa
(
Id int IDENTITY(1,1) NOT NULL,
Name varchar(13) NOT NULL
)
insert into aaa(Name)
select '111' union all
select '222' union all
select '333' union all
select '444' union all
select '555' union all
select '666' union all
select '777' union all
select '888'
Run Code Online (Sandbox Code Playgroud)
[2]
点击
http://en.wikipedia.org/wiki/Isolation_(database_systems)复制并粘贴或添加尾随)
更新:
SELECT WITH(NOLOCK)未被阻止...
Update2:
或者,与之相同,READ UNCOMMITTED
请注意,UPDATE与SELECT行不同.
即使如果相同,这种行为也与隔离级别的描述相矛盾[2]
要点是:
SQL Server 2008 R2开发
我相信这是因为你没有主键,我认为这会导致锁升级,从而阻塞了SELECT.如果在ID列上添加PRIMARY KEY,您会注意到如果再次尝试,SELECT将立即返回其他3行 - 不需要WITH(NOLOCK)提示.
| 归档时间: |
|
| 查看次数: |
3280 次 |
| 最近记录: |