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 저장 프로 시저를 사용하여이 문제를 직면해야 didnt가 : 오라클의 새로운
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
임과 이에 대한 솔루션 silimilar을 찾을 수 couldnt한다. 누군가 내가 뭘 잘못하고 있는지 말해줘.