Oracle事务回滚不起作用(Insert + ArrayBinding + Returning)

时间:2017-03-09 00:44:52

标签: c# oracle

当Oracle Transaction.Rollback不起作用时,我的一个客户面临一个奇怪的问题。

似乎必须使用以下内容:

  • Transaction或TransactionScope
  • PL / SQL(BEGIN END)
  • 包含至少2个项目的ArrayBinding
  • 返回陈述

即使已经调用了回滚,这两个项目仍然会插入到数据库中。

任何人都知道为什么会发生这种行为?

using (var connection = new OracleConnection(ConfigurationManager.ConnectionStrings["OracleCodeFirstEntities"].ConnectionString))
{
    connection.Open();
    var transaction = connection.BeginTransaction();

    using (var command = connection.CreateCommand())
    {
        command.BindByName = true;

        command.CommandText = @"
BEGIN
INSERT  INTO ""SYSTEM"".""EF_0104"" (""IntColumn"") VALUES(:P_0) RETURNING ""ID"" INTO :ZZZOUTPUT_0;
END;
";
        int[] array = new int[] { 1, 2 };

        var param1 = command.CreateParameter();
        param1.ParameterName = "P_0";
        param1.DbType = DbType.Int32;
        param1.Value = array;


        var param2 = command.CreateParameter();
        param2.Direction = ParameterDirection.Output;
        param2.ParameterName = "ZZZOUTPUT_0";
        param2.DbType = DbType.Int32;
        param2.Value = array;

        command.Parameters.Add(param1);
        command.Parameters.Add(param2);

        command.ArrayBindCount = array.Length;
        command.ExecuteNonQuery();
    }

    transaction.Rollback();
}

添加其他信息

  

如果在transaction.Rollback()

之前有异常

不,回滚成功完成且没有错误。

如果我只使用数组中的一个项目,则会发生回滚,如果我在没有返回语句的情况下执行回滚,则会发生回滚,但如果发生这种情况,则不会发生回滚。

  

您正在使用哪个数据库提供程序

我使用过Oracle.ManagedDataAccess(v4.121.2.0)

  

问题可能是自动提交已启用吗?

我不认为这是问题,因为如果我删除其中一个变体,则回滚可以正常工作。

  

你有没有开启oracle追踪

我将在明天检查;我现在对Oracle不太熟悉。

0 个答案:

没有答案