我有一个.Net 3.5 winforms应用程序,其中运行了多个步骤。 每个步骤都进行一些计算并调用一个或多个存储过程。这些存储过程中的一些在oracle数据库的表中执行多个更新/插入。
App UI具有每个步骤的“进程”和“取消进程”按钮。如果使用命中取消进程按钮,则应用程序应该将数据库状态回滚到其先前状态...即。使交易成为ATOMIC。
所以,我的问题是,这可能是吗??如果是的话,要实现这种原子性,我需要在应用程序和数据库方面处理所有事情吗?
我是否需要在此处使用.Net的事务API?此外,是否需要在那些存储过程中使用BEGIN / COMMIT TRANSACTION块?
请分享您的想法。
感谢。
答案 0 :(得分:2)
首先,是的,其次,您的C#应用程序(特别是任务层)应该管理事务,除非您能保证能够执行在父回滚时回滚的嵌套事务,否则sprocs不应该是事务性的(并且关于WRT神谕,我不能发言。
使用OracleConnection对象,在开始所有工作之前,请调用BeginTransaction()。然后使用该连接执行所有OracleCommand操作。
然后,如果你调用Transaction.RollBack或Transaction.Commit,你应该回滚或提交所有的sproc工作。
来自链接的示例:
public void RunOracleTransaction(string myConnString)
{
OracleConnection myConnection = new OracleConnection(myConnString);
myConnection.Open();
OracleCommand myCommand = myConnection.CreateCommand();
OracleTransaction myTrans;
// Start a local transaction
myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted);
// Assign transaction object for a pending local transaction
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "INSERT INTO Dept (DeptNo, Dname, Loc) values (50, 'TECHNOLOGY', 'DENVER')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "INSERT INTO Dept (DeptNo, Dname, Loc) values (60, 'ENGINEERING', 'KANSAS CITY')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
myTrans.Rollback();
Console.WriteLine(e.ToString());
Console.WriteLine("Neither record was written to database.");
}
finally
{
myConnection.Close();
}
}