C# 不同的事务同时提交

C# 不同的事务同时提交,c#,oracle,ibm-mq,C#,Oracle,Ibm Mq,我有一个WebSphere MQ和我的Oracle数据库。我从MQ获取消息并将其写入数据库。目前,这是通过以下代码完成的: private MQHandler _mqHandler; private OracleDBConnector _db; private OracleDBUtils _dbUtil; _db = new OracleConnection(); _db.ConnectionString = ConfigurationManager.ConnectionStrings["C

我有一个WebSphere MQ和我的Oracle数据库。我从MQ获取消息并将其写入数据库。目前,这是通过以下代码完成的:

private MQHandler _mqHandler;
private OracleDBConnector _db;
private OracleDBUtils _dbUtil;

_db = new OracleConnection();

_db.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
_db.Open();


try 
{
    using (TransactionScope tran = new TransactionScope())
    {
        _db.BeginTransaction();

        //read from Queue
        oMqResult = _mqHandler.ReadTransactionQMsg(sChannelName);
        //write into database and some other magic 
        ........

        if (noError) {
            // Commit queue
            _mqHandler.Commit();
            // Commit database
            _db.Commit();
            // Commit transactionscope
            tran.Complete();
        }
    }
}
catch (Exception ex)
{
    _mqHandler.Backout();
    _db.Rollback(); 
}

如果没有例外,一切都好。但我的问题是:当
\u mqHandler.Commit()时会发生什么工作正常,然后
\u db.Commit()失败?在这个例子中TransactionScope到底是如何工作的?此tran对象能否提交并回滚队列和数据库?

如果在发出tran.Complete()之前引发异常,则这两个操作都应回滚您需要按如下方式研究这些术语

  • XA事务(两阶段提交(2PC))

  • JTA(Java事务API)

  • TransactionManager(按实现类配置事务的全局协调)


  • 即使在_mqHandler.Commit()/_db.Commit()之后,也要为响应延迟道歉。再次查看代码,要使db操作在事务作用域下,必须发出_db.Open();在transactionScope中,确保db操作处于事务之下。我认为您应该阅读一些关于XA(分布式事务)的内容。