代码之家  ›  专栏  ›  技术社区  ›  radbyx Matt

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

  •  0
  • radbyx Matt  · 技术社区  · 14 年前

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

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

    我们有一个方法,它将一个新行插入到一个表中(表_A),并且它可以很好地处理事务。如果一个异常被抛出,它将执行回滚。

    我的问题是,另一个用户不能同时执行任何与表_A相关的操作-可能是因为它被锁定了。

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

    我试图在事务上设置isolationlevel readuncommitted和serializable,但它没有工作。

    所以我想知道我是否还需要重写所有的select方法,这样它们就可以选择除making中的新行之外的所有行?

    例子:

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

    所以我想我需要以某种方式将用户b的select查询从“select all query”改写为“select all rows that i s not bind to a transaction query”。:)

    任何小费都很贴心,谢谢。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Damien_The_Unbeliever    14 年前

    您需要对所选内容进行更改,而不是对执行插入操作的事务进行更改。

    你可以

    • 为执行选择的连接设置未提交的隔离级别读取,或者
    • 指定 WITH (NOLOCK) 提示正在被锁定的表,或
    • 指定 WITH (READPAST) 关于表被锁定的提示

    如我所说,这三个选项都是您要应用于选择的内容,而不是插入的内容。

    最后一个选择可能是启用 SNAPSHOT isolation ,并将数据库默认值更改为使用该默认值(如果应用程序没有在启用快照隔离的情况下进行构建/测试,那么这里可能会包含许多警告)

        2
  •  0
  •   Edgar Hernandez    14 年前

    可能你需要的是将隔离级别设置为 Read Committed Snapshot .

    尽管tempdb需要更多的空间,但当您不希望自己的选择锁定表时,这是非常好的。

    小心摆姿势 problems 使用此隔离级别时。