我应该使用哪种事务隔离级别来防止在选择数据时插入数据?

时间:2014-05-26 09:45:18

标签: c# asp.net sql-server

我有三个表,table ATableB以及Table C

我希望使用table Ajointable B读取数据,并将结果插入Table C。 我不希望任何其他交易可以在table A joiningTablA

Table B.插入任何记录

我应该使用哪个isolation level?是否正确使用read committed isolation level

5 个答案:

答案 0 :(得分:3)

你问的是错误的问题。

您不应该阻止插入,为什么要这样做,特别是在您描述的并发环境中?你只能看到堵塞和死锁。

相反,您应该问How can I ensure that the join between A and B is consistent?这意味着连接在连接期间不会看到任何记录插入,而不会阻止所述插入。答案是使用SNAPSHOT ISOLATION

使用SNAPSHOT ISOLATION每次运行连接时,您将只看到连接开始时已提交的行。在连接开始后插入(在A或B中)的行不可见。因此,连接始终是一致的。重要的是你不要阻止插入,你也不会死锁。听起来好得令人难以置信?当然没有免费午餐,快照隔离有成本,请参阅Row Versioning Resource Usage

这是关于这个主题的好读物:Implementing Snapshot or Read Committed Snapshot Isolation in SQL Server: A Guide

答案 1 :(得分:1)

不,请选择目前方案中最佳的Serializable选项,因为它们用于阻止用户添加添加到表中的新记录。

答案 2 :(得分:0)

您应该使用MSDN中的Serializable

"范围锁定放在DataSet上,防止其他用户在事务完成之前更新或插入数据集。"

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.data.isolationlevel.aspx

答案 3 :(得分:0)

不考虑阻塞插入,而是考虑对读取使用快照隔离。这样,您就可以获得一个时间点完全一致且稳定的快照。并发DML不会打扰您的读取。

如果您需要阻止插入,SERIALIZABLE是最低要求级别。您可能会受到阻塞和死锁的困扰。因此,如果您可以使用它,我建议您使用快照隔离。

答案 4 :(得分:0)

您好我也会选择可序列化

Read uncommitted (the lowest level where transactions are isolated only enough to ensure that physically corrupt data is not read)
Read committed (Database Engine default level)
Repeatable read
Serializable (the highest level, where transactions are completely isolated from one another)*

参考清楚显示将使用的链接: -

http://technet.microsoft.com/en-us/library/ms189122%28v=sql.105%29.aspx