我应该选择什么sql server隔离级别来防止并发读取?

时间:2010-04-09 13:50:48

标签: sql-server transactions

我有以下交易:

  1. SQL在名为tbl_document
  2. 的表中插入1条新记录
  3. SQL删除与另一个名为tbl_attachment
  4. 的表中的条件匹配的所有记录
  5. SQL将多个记录插入到tbl_attachment
  6. 在此事务完成之前,我不希望其他用户知道(1)tbl_document中的新记录,(2)tbl_attachment中的已删除记录,以及(3)tbl_attachment中的已修改记录。

    Read Committed Isolation是否是正确的隔离级别?

2 个答案:

答案 0 :(得分:2)

写入的事务隔离级别无关紧要。重要的是读取的隔离级别。通常读取将看到您的插入/更新/删除,直到提交。唯一的隔离级别可以看到未提交的更改是READ UNCOMMITTED。如果并发线程使用脏读,则可以在写中执行 nothing 以防止它。

READ UNCOMMITTED可以设置为隔离级别,也可以使用(NOLOCK)表提示显式请求。脏读可以看到不一致的交易数据(例如,借记不平衡操作的功劳),也可能导致重复读取(从表中多次读取同一行)并触发神秘的密钥违规。

答案 1 :(得分:1)

是的,就像这样:

BEGIN TRANSACTION

   insert into tbl_document ...
   delete tbl_attachment where ...
   inserts into tbl_attachment ...

COMMIT

您可以阻止/锁定用户,直到完成并提交/回滚事务为止。此外,有人可以在插入tbl_document之后但在删除之前从tbl_attachment中选择行。如果您需要阻止这样做:

BEGIN TRANSACTION

   select tbl_attachment with (UPDLOCK,HOLDLOCK) where ...
   insert into tbl_document ...
   delete tbl_attachment where ...
   inserts into tbl_attachment ...

COMMIT

或者只是在插入tbl_document之前删除tbl_attachment并忘记带锁定提示的select。