将所有sql调用包装在ISOLATION LEVEL SERIALIZABLE中是否会删除所有并发问题?

时间:2013-08-07 07:34:40

标签: sql sql-server database sql-server-2008

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

  

设置交易隔离级别可串行化


     开始转发

     
--sqlstatements here
  
     

选项(MAXDOP 1)

     

COMMIT TRAN

我们只是说我并不关心表现。我只想防止约束违规,以及由两个或多个同时线程访问同一个数据库引起的死锁。

这是否有效地消除了所有死锁并且还限制了竞争条件引起的问题?

如果我已经在可序列化的事务中包装了调用,是否还需要为CUD函数显式使用(保持锁定,更新锁定)?

2 个答案:

答案 0 :(得分:1)

这取决于“并发问题”的含义。如果您在此包含死锁,那么您可能仍需要在查询中包含锁定提示(例如:updlock

答案 1 :(得分:0)

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

当一个事务读取另一个未提交的事务所写的数据时,会发生

Dirty Reads。脏读的危险在于,另一个事务可能永远不会提交,而原始事务会使用" dirty"数据

当一个事务尝试两次访问相同数据并且第二个事务在第一个事务的读取尝试之间修改数据时,会发生

Non-repeatable Reads。这可能导致第一个事务为同一数据读取两个不同的值,导致原始读取不可重复

当一个事务多次访问一系列数据并且第二个事务在第一个事务的读取尝试之间插入或删除属于该范围的行时,会发生

Phantom Reads。这可能导致幻象"行从第一个交易的角度出现或消失。