我们应该使用哪种数据库隔离,哪种隔离级别最好?

时间:2011-01-28 20:02:07

标签: sql sql-server sql-server-2005 tsql

在SQL Server 2005中,

我有很多存储过程,一些用于事务的更新表记录,一些用于获取表记录。

当一个SP调用一个正在更新表记录的seetion时,如果我运行另一个SP来进行getiing表数据,那么它应该在没有等待的情况下运行,我需要做什么?

我们应该使用哪种数据库隔离,哪种隔离级别最好?

“transalation快照隔离级别”可能是合理的。但它会在Teampdb数据库中选择旧的快照数据,这可能会降低性能。

你的建议是什么?

3 个答案:

答案 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隔离级别除外,但在这种情况下,您可能会有非常不一致的数据)。