Во-первых, да, а во-вторых, ваше приложение C # (в частности, уровень задач) должно управлять транзакциями, sprocs НЕ ДОЛЖЕН быть транзакционным, если вы не можете гарантировать возможность делать вложенные транзакции, которые откатываются при откате родительского элемента (иЯ не могу говорить по этому вопросу о оракуле WRT)
http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracleconnection_methods%28v=VS.71%29.aspx
С вашим объектом 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();
}
}