我有两个事务:具有SERIALIZABLE隔离级别的 T1 和 T2(我认为 - 具有默认READ COMMITTED隔离级别,但没关系)。
SELECT然后事务 T1 执行WAITFOR2 秒SELECT。
事务 T2UPDATE对 T1 读取的数据执行。
它导致死锁,为什么事务 T2 不等待 T1 结束?
当 T1 具有REPEATABLE READ隔离级别时,一切正常,即出现幻像行。我以为当我将隔离级别提高到 时SERIALIZABLE,T2 将等待 T1 结束。
这是我大学运动的一部分。我必须在两个具有不正确隔离级别的并行事务中显示负面影响,并且在正确的隔离级别下不存在这些影响。
这是代码,不幸的是,字段名称是波兰语。
T1:
使用先生;
SET IMPLICIT_TRANSACTIONS 关闭;
设置事务隔离级别可序列化;
开始交易;
-- 1. 扎皮塔尼
选择
www.IdSamochodu, s.Model, s.Marka, s.NrRejestracyjny, o.PESEL, o.Nazwisko, o.Imie, o.NrTelefonu
从
WizytyWWarsztacie www
加入
萨摩奇
ON s.IdSamochodu = www.IdSamochodu
加入
奥索比
ON o.PESEL = s.PESEL
在哪里
www.[状态] = 'gotowy_do_odbioru'
由 www.IdSamochodu ASC 订购
;
等待延迟'00:00:02';
-- 2. 扎皮塔尼
选择
u.IdSamochodu,tu.Nazwa,tu.Opis,u.Oplata
从
乌斯鲁吉乌
加入
TypyUslug tu
ON tu.IdTypuUslugi = u.IdTypuUslugi
加入
WizytyWWarsztacie www
在 www.IdSamochodu = u.IdSamochodu 和
www.DataOd = u.DataOd
在哪里
www.[状态] = 'gotowy_do_odbioru'
由 u.IdSamochodu ASC、u.Oplata DESC 订购
;
犯罪;
T2:
使用先生;
SET IMPLICIT_TRANSACTIONS 关闭;
将事务隔离级别设置为已提交;
开始交易;
更新
乌斯鲁吉
放
[状态] = 'wykonano'
在哪里
IdUslugi = 2
;
更新
万维网
放
www.[状态] = 'gotowy_do_odbioru'
从
WizytyWWarsztacie www
在哪里
www.[状态] = 'wykonywanie_usług' AND
存在(
选择 1
从
乌斯鲁吉乌
在哪里
u.IdSamochodu = www.IdSamochodu 和
u.DataOd = www.DataOd AND
u.[状态] = 'wykonano'
由 u.IdSamochodu、u.DataOd 分组
有计数(u.IdUslugi)=(
选择
计数(u2.IdUslugi)
从
乌斯鲁吉 u2
在哪里
u2.IdSamochodu = www.IdSamochodu 和
u2.DataOd = www.DataOd
由 u2.IdSamochodu、u2.DataOd 分组
)
)
;
犯罪;
我使用 SQL Management Studio,每个事务都在不同的文件中。我通过在 T1 中单击 F5 来运行它,然后快速切换到包含 T2 的文件,然后再次 - F5。
我在 mssql 中阅读了有关死锁和锁定机制的信息,但显然,我还没有理解这个主题。
SQL Server 2008 R2(.Net 2.0 应用程序)中的死锁问题
http://msdn.microsoft.com/en-us/library/ms173763(v=sql.105).aspx
http://www.sql-server-performance.com/2004/advanced-sql-locking/
编辑
我发现 T2 中的第一个 UPDATE 语句导致了问题,为什么?

