我有两个事务:具有SERIALIZABLE
隔离级别的 T1 和 T2(我认为 - 具有默认READ COMMITTED
隔离级别,但没关系)。
SELECT
然后事务 T1 执行WAITFOR
2 秒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 语句导致了问题,为什么?