там мой коллега указал на проблему.
Кажется, что нужно использовать одно и то же соединение и одну и ту же транзакцию, чтобы иметь возможность откатить многоступенчатую вставку, подобную этой. И что на транзакцию может быть только один коммит.
Это означает, что каждая из моих функций, которые имели свои собственные команды подключения и транзакции, должна была быть изменена, чтобы сначала принять аргументы OracleConnection и OracleTransaction и удалить код commit () и другие связанные строки.
Таким образом, изменяя код, который я разместил, это выглядело бы так
OracleConnection conn = new OracleConnection();
// .... create your command, set the connection string, etc, etc
var transaction = conn.BeginTransaction();
cmd.Transaction = transaction;
try
{
tableAinsert.ExecuteNonQuery();
id= Int32.Parse(tableAinsert.Parameters["id"].Value.ToString());
if (vsType == "I")
{
tableBinsert(vsType, eventId, id, conn, transaction);
}
transaction.Commit(); //Moved this commit to the end of the block
}
catch (Exception err)
{
transaction.Rollback();
throw (err);
}