2

当我在 MS SQL Server 2008 中启动事务并更新表记录时,除非我提交事务,否则 SQL 服务器会锁定其他用户读取该记录(在隔离级别 = 已提交读的情况下)。

我如何允许其他用户在我的事务期间和我提交之前读取原始值(在 ReadCommitted 的情况下)?

例如:如果我在人员表上启动事务并将人员名称从“Alex1”更新为“Alex2”,在 Readcommitted 隔离级别的情况下,除非我提交事务,否则其他用户无法读取记录!那么如何允许其他用户在我的事务期间读取原始值“Alex1”(我不希望他们读取未提交的值),当我提交它时,他们可以读取提交的值“Alex2 “?

谢谢,

4

2 回答 2

2

我找到了答案:)

有一个属性“Is Read Committed Snapshot On”(可以通过右键单击数据库->选项-> Is Read Committed Snapshot On:True来设置)。该属性为真,其他用户可以读取当前的修改记录(已提交的不是脏读),直到事务提交后才能修改。

于 2014-03-09T14:38:51.070 回答
1

从源头引用关于READ COMMITTED TRANSACTION ISOLATION LEVEL

指定语句不能读取已被其他事务修改但未提交的数据。这可以防止脏读。当前事务中的各个语句之间的其他事务可以更改数据,从而导致不可重复读取或幻像数据。此选项是 SQL Server 的默认选项。

READ COMMITTED 的行为取决于 READ_COMMITTED_SNAPSHOT 数据库选项的设置:

如果 READ_COMMITTED_SNAPSHOT 设置为 OFF(默认值),则数据库引擎使用共享锁来防止其他事务在当前事务正在运行读取操作时修改行。共享锁还阻止语句读取其他事务修改的行,直到其他事务完成。共享锁类型决定何时释放。在处理下一行之前释放行锁。读取下一页时释放页锁,语句完成时释放表锁。

在我的解释中,这意味着您仍然可以READ COMMITTED在事务提交之前读取数据,前提是您shared lock typerow lock.

于 2014-03-08T23:55:47.690 回答