【问题标题】:Different transaction commits at same time不同的事务同时提交
【发布时间】:2017-10-11 13:05:40
【问题描述】:

我有一个 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(); 
}

如果没有异常发生,一切正常。但我的问题是:当_mqHandler.Commit(); 工作正常然后_db.Commit(); 失败时会发生什么? TransactionScope 在这个例子中究竟是如何工作的?这个 tran-Object 可以提交和回滚队列和数据库吗?

【问题讨论】:

  • 我认为您应该阅读一些有关 XA(分布式事务)的内容。

标签: c# oracle ibm-mq


【解决方案1】:

你需要学习这些术语如下。

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

  2. JTA(Java 事务 API)

  3. TransactionManager(通过实现类配置事务的全局协调)

【讨论】:

    【解决方案2】:

    如果在 tran.Complete() 发出之前抛出异常,那么这两个操作都应该回滚

    【讨论】:

    • 即使在 _mqHandler.Commit() / _db.Commit() 之后?
    • 对延迟回复表示歉意。再次查看您的代码,要使数据库操作在事务范围内,您必须发出 _db.Open();在 transactionScope 中确保 db 操作在事务下。
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多