事务会阻止其他代码读取不一致的数据吗?

时间:2011-08-22 16:29:16

标签: sql sql-server transactions

我有一个存储过程,可以在单个事务中插入多个表。我知道事务可以通过允许在错误,电源故障等之后进行回滚来维持非并发情况下的数据一致性,但如果其他代码在我提交事务之前从这些表中选择,是否可能选择不一致的数据?

基本上,您可以选择未提交的交易吗?

如果是这样,那么人们通常如何处理这个问题?

3 个答案:

答案 0 :(得分:7)

这取决于读取查询的ISOLATION LEVEL而不是事务。这可以在连接上集中设置,也可以在SELECT提示中提供。

请参阅: 连接方:http://msdn.microsoft.com/en-us/library/system.data.isolationlevel.aspx

数据库方:http://msdn.microsoft.com/en-us/library/ms173763.aspx

答案 1 :(得分:1)

正如Aliostad已经提到的,这取决于所选的isolation level。维基百科文章提供了不同常见场景的示例。

所以是的,您可以选择获取未提交的数据,但只能选择。我从来没有这样做过,我不得不承认这个想法对我来说有点危险。但是可能有合理的用例。

答案 2 :(得分:0)

延长Aliostad的回答:

默认情况下,其他读取进程不会读取正在更改的数据(未提交,即“脏读”)。这适用于所有客户和驱动程序

您必须使用NOLOCK提示故意覆盖此默认值或更改隔离级别以允许“脏读”。