在SQL Server 2005中,
我有很多存储过程,一些用于事务的更新表记录,一些用于获取表记录。
当一个SP调用一个正在更新表记录的seetion时,如果我运行另一个SP来进行getiing表数据,那么它应该在没有等待的情况下运行,我需要做什么?
我们应该使用哪种数据库隔离,哪种隔离级别最好?
“transalation快照隔离级别”可能是合理的。但它会在Teampdb数据库中选择旧的快照数据,这可能会降低性能。
你的建议是什么?
答案 0 :(得分:1)
READ COMMITTED
是SQL Server中的默认事务隔离级别。
使用任何其他隔离级别(对我来说,无论如何)构成 code smell - 对我来说,至少 - 这需要一些真正的理由,可能的例外是有限的使用在某些情况下READ UNCOMMITTED
。{/ p>
答案 1 :(得分:1)
您应该使用SNAPSHOT
隔离级别。最好的方法是在数据库级别打开READ COMMITTED SNAPSHOT,它会将所有默认的READ COMMITTED事务静默转换为快照事务。
SNAPSHOT最适合应用程序的原因,特别是对于因并发问题而可能遇到阻塞的应用程序,是无数的,而且好处是无穷无尽的。确实,SNAPSHOT隔离发生在cost in resources used,但除非您测量并找到导致问题的行版本存储的确凿证据,否则您不能提前解除它。
一个永远不应该使用的隔离级别是不安全的。那是在惹麻烦。 Dirty reads are inconsistent reads
REPEATABLE和SERIALIZABLE具有极其狭窄的用例,您很可能永远不需要它们。不幸的是SERIALIZABLE被.Net System.Transactions和MTS / COM +滥用,所以很多应用程序最终都使用它(因为它有很大的可伸缩性问题),尽管不是必需的。
答案 2 :(得分:0)
如果某个表中的第一个事务更新数据,那么第二个将等待获取此数据(READ UNCOMMITTED隔离级别除外,但在这种情况下,您可能会有非常不一致的数据)。