我有以下交易:
在此事务完成之前,我不希望其他用户知道(1)tbl_document中的新记录,(2)tbl_attachment中的已删除记录,以及(3)tbl_attachment中的已修改记录。
Read Committed Isolation是否是正确的隔离级别?
答案 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。