1

为了防止并发错误,我决定用这个包装我所有的 sql 调用(都在存储过程中)sql 语句(所有 crud 操作,例如更新/插入/ upserts 甚至只是表读取)

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran

--sqlstatements here

选项(MAXDOP 1)

提交翻译

让我们说我不关心性能。我只想防止违反约束,以及由 2 个或更多同时访问同一数据库的线程引起的死锁。

这是否有效地消除了所有死锁以及竞争条件引起的约束问题?

如果我已经将调用包装在可序列化事务中,是否还需要显式使用 with(保持锁、更新锁)来实现 CUD 功能?

4

2 回答 2

2

这取决于您所说的“并发问题”是什么意思。如果您在其中包含死锁,那么您可能仍需要updlock在查询中包含锁定提示(例如:)

于 2013-08-07T08:08:45.507 回答
1

可序列化隔离级别可防止所有三个已知的并发问题,因为可序列化级别应用范围锁,因此您无法修改具有事务范围的行。它可以防止(但死锁是可能的):

Dirty Reads当一个事务读取由另一个未提交事务写入的数据时发生。脏读的危险在于另一个事务可能永远不会提交,从而使原始事务留下“脏”数据。

Non-repeatable Reads当一个事务尝试访问相同的数据两次并且第二个事务在第一个事务的读取尝试之间修改数据时发生。这可能会导致第一个事务读取相同数据的两个不同值,导致原始读取不可重复

Phantom Reads当一个事务多次访问某个范围的数据,而第二个事务在第一个事务的读取尝试之间插入或删除该范围内的行时,就会发生这种情况。从第一个事务的角度来看,这可能会导致“幻像”行出现或消失。

于 2013-08-07T07:55:03.260 回答