为了防止并发错误,我决定将所有我的sql调用(都在存储过程中)包装在sql语句中(所有crud操作,例如update / insert / upserts,甚至只是表读取)此
设置交易隔离级别可串行化
开始转发--sqlstatements here
选项(MAXDOP 1)
COMMIT TRAN
我们只是说我并不关心表现。我只想防止约束违规,以及由两个或多个同时线程访问同一个数据库引起的死锁。
这是否有效地消除了所有死锁并且还限制了竞争条件引起的问题?
如果我已经在可序列化的事务中包装了调用,是否还需要为CUD函数显式使用(保持锁定,更新锁定)?
答案 0 :(得分:1)
这取决于“并发问题”的含义。如果您在此包含死锁,那么您可能仍需要在查询中包含锁定提示(例如:updlock
)
答案 1 :(得分:0)
可序列化隔离级别可防止所有三个已知并发问题,因为可序列化级别应用范围锁定,因此您无法修改事务范围内的行。 它可以防止(但可能出现死锁):
当一个事务读取另一个未提交的事务所写的数据时,会发生 Dirty Reads
。脏读的危险在于,另一个事务可能永远不会提交,而原始事务会使用" dirty"数据
Non-repeatable Reads
。这可能导致第一个事务为同一数据读取两个不同的值,导致原始读取不可重复
Phantom Reads
。这可能导致幻象"行从第一个交易的角度出现或消失。