我在Oracle中遇到了事務問題。我有一些程序是這樣的:在oracle中使用「嵌套」事務
create or replace procedure myschema.DataSave(v_value IN NUMBER)
as
begin
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
begin
insert/update/delete...
exception when OTHERS then goto error;
end;
COMMIT;
return;
<<error>>
ROLLBACK;
return;
end;
/
我打電話這種形式從C#項目這個程序:
...
string conn_str = "...";
OracleConnection con = new OracleConnection(conn_str);
con.Open();
OracleCommand cmd = new OracleCommand("", con);
try
{
cmd.Transaction = cmd.Connection.BeginTransaction();
for (int i = 0; i < 10; i++)
{
// this condition simulates incorrect situations
if (i == 5)
{
throw new Exception("Something is wrong.");
}
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "myschema.DataSave";
cmd.Parameters.Clear();
cmd.Parameters.Add("v_value", OracleDbType.Int32, i, ParameterDirection.Input);
}
cmd.Transaction.Commit();
}
catch (Exception ex)
{
cmd.Transaction.Rollback();
}
finally
{
con.Close();
con.Dispose();
}
...
所以我想在數據庫中使用一個「內部」或「嵌套」的交易層和應用層上的另一個「外部」事務。但是,當拋出應用程序中的異常時,回滾不起作用(先前保存的數據 - 1,2,3,4 - 保留在數據庫中)。但爲什麼?我沒有使用MSSQL和存儲過程,以這種形式來面對這個問題:
create procedure myschema.DataSave
@id as int
as
begin
begin transaction
insert/update/delete...
if @@error > 0 goto error
commit transaction
return
error:
rollback transaction
return
end
go
進出口新的Oracle和無法找到解決silimilar了這一點。請有人告訴我我做錯了什麼。