繁体   English   中英

如何使用ADO.NET实现嵌套的SQL事务?

[英]How to implement nested SQL transactions with ADO.NET?

我需要使用ADO.NET在.NET中实现嵌套事务。

情况如下:

--> Start Process (Begin Transaction)       

   --> Do DB things       

   --> Begin Transaction for step 1
   --> Step 1
   --> Commit transaction for step 1

   --> Begin transaction for step 2
   --> Step 2
   --> Rollback transaction for step 2

   --> etc ...

   --> Do DB things       


--> End Process(Commit or Rollback ALL commited steps --> a.k.a the process)

交易范围可以做到吗? 有人可以举一个例子吗?

另外,我需要该过程适用于SQL Server 2005和Oracle 10g数据库...事务作用域是否可以同时用于两个数据库引擎?

编辑:请注意这种情况可能会发生:

步骤1提交,步骤2回滚步骤3提交。

该过程已提交

(Step1和Step3确实将数据存储到数据库中,而step2 则没有

另一方面...

步骤1提交,步骤2回滚步骤3提交。

该过程将回滚。

没有数据提交到数据库

注意:没有可用的数据库架构或域值

您可以在TSQL中通过保存点(在SQL Server上为SAVE TRAN )来做到这一点,但坦率地说,我不建议这样做。 无法通过TransactionScope 执行此操作,因为任何终止都将终止(一旦树中的任何事务指示失败,整个事务都会回滚)。

个人:首先检查数据,然后仅执行有效操作。 如果失败,则为终端-将其回滚。 可能将工作分成原子单元,这些原子单元可以独立地真正提交(或回滚)。

本文讨论保存点和嵌套事务。

http://msdn.microsoft.com/zh-CN/library/ms971557.aspx

在Oracle上:

BEGIN    
  SAVEPOINT STEP1;
  -- do some things
  IF your_criteria_for_commit_is_needed THEN
    NULL; -- do nothing
  ELSE
    ROLLBACK TO SAVEPOINT STEP1;
  END IF;

  SAVEPOINT STEP2;
  -- do some other things
  IF your_other_criteria_for_commit_is_needed THEN
    NULL; -- do nothing
  ELSE
    ROLLBACK TO SAVEPOINT STEP2;
  END IF;

  -- SOME NUMBER OF OTHER STEPS

  IF your_criteria_for_all_step_commit_is_needed THEN
    COMMIT; -- commit all changes to DB
  ELSE
    ROLLBACK; -- rollback all changes
  END IF;
END;
/

如果您希望所有步骤都被落实或不执行,那么一笔交易会更合适吗? 您可以将现有的事务对象传递给ADO.Net Command对象的构造函数 ,从而在单个事务的范围内执行多个更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM