如何使用事务并一起选择,使用sql 2008

时间:2010-09-06 07:50:24

标签: sql sql-server-2008 transactions

我们有一个带有SQL2008数据库的ASP.NET站点。

我正在尝试在当前系统中实现事务。

我们有一个方法是将一个新行插入一个表(Table_A),它可以在事务中正常工作。如果抛出异常,它将进行回滚。

我的问题是,另一个用户无法在同一时间内使用Table_A执行任何操作 - 可能是因为它被锁定了。

我可以理解为什么事务必须锁定新行,但我不希望它锁定整个表 - 强制user_B等待user_A完成。

我已尝试在事务上设置isolationlevel ReadUncommitted和Serializable,但它不起作用。

所以我想知道我是否还需要重写所有的select方法,所以他们能够选择除了新行之外的所有行?

示例:

  • 表T有10行(记录?)
  • 用户A正在向表T中插入新行。这需要一些时间。
  • 同时,用户B想要选择10行,而不关心新行。

所以我想我不知何故需要将用户B的select查询从“select all query”重写为“选择所有未绑定到事务查询的行”。 :)

任何提示都很受欢迎,谢谢。

2 个答案:

答案 0 :(得分:1)

您需要更改您的选择,而不是对正在执行插入的事务进行更改。

你可以

  • 为执行select的连接设置隔离级别读取未提交,或
  • 针对正在锁定的表格指定WITH (NOLOCK)提示,或
  • 针对被锁定的表格指定WITH (READPAST)提示

正如我所说,所有这三个选项都是你应用于SELECT的东西,而不是INSERT。

最后一个选项可能是启用SNAPSHOT isolation,并更改数据库默认值以使用它(如果尚未使用快照隔离构建/测试应用程序,可能会在此处包含许多警告上)

答案 1 :(得分:0)

您可能需要将隔离级别设置为Read Committed Snapshot

虽然tempdb需要更多空间,但如果你不希望你的选择锁定表格,那就太棒了。

使用此隔离级别时要小心problems