Delphi XE +DBX+SQL Server2008 关于事务回滚有关问题
Delphi XE +DBX+SQL Server2008 关于事务回滚问题
请问有没有人知道dbexpress + SQL Server 客户端提交数据如何处理事务?
我客户端用的TSQLConnection来连接,但是不知道怎么处理事务,在网上找了一些方法都不适用。
请告知 dbexpress + SQL Server 的事务回滚方法
我用过的方法
方法一:
var
tran:TDBxTransaction;
begin
try
tran:= dm.SQL_Conn.BeginTransaction(TDBXIsolations.ReadCommitted);
dm.cds_DBXQuery.Close;
dm.cds_DBXQuery.CommandText:=xxx;
dm.cds_DBXQuery.Execute;
dm.SQL_Conn.CommitFreeAndNil(tran);//执行到这里报raised exception class
//EDatabaseError with message 'Invalid transaction Object'.
except
On e:Exception do
begin
dm.SQL_Conn.RollbackFreeAndNil(tran);
raise;
end;
end;
end;
----------------
方法二: 虽然执行不抱错,但是并没有回滚
var
tran:TTransactionDesc;
begin
try
tran.TransactionID:=1;
tran.IsolationLevel:=xilREADCOMMITTED;
dm.cds_DBXQuery.Close;
dm.cds_DBXQuery.CommandText:=xxx;
dm.cds_DBXQuery.Execute;
dm.SQL_Conn.Commit(tran);//替换成 dm.SQL_Conn.Rollback(tran);测试回滚,但遗憾的是没有报错也没有回滚
except
On e:Exception do
begin
dm.SQL_Conn.Rollback(tran);
raise;
end;
end;
end;
------解决方案--------------------
最好写在存储过程里面 在存储过程去回滚...
本来回滚就是因为数据连接有问题,你还在Delphi 里面回滚貌似不太好吧.
------解决方案--------------------
有可能BeginTransaction无效,
或者上个事务还没执行完,开始新事务前,最好先判断一下事务的状态
------解决方案--------------------
我的也是XE + sql2008,没有问题
请问有没有人知道dbexpress + SQL Server 客户端提交数据如何处理事务?
我客户端用的TSQLConnection来连接,但是不知道怎么处理事务,在网上找了一些方法都不适用。
请告知 dbexpress + SQL Server 的事务回滚方法
我用过的方法
方法一:
var
tran:TDBxTransaction;
begin
try
tran:= dm.SQL_Conn.BeginTransaction(TDBXIsolations.ReadCommitted);
dm.cds_DBXQuery.Close;
dm.cds_DBXQuery.CommandText:=xxx;
dm.cds_DBXQuery.Execute;
dm.SQL_Conn.CommitFreeAndNil(tran);//执行到这里报raised exception class
//EDatabaseError with message 'Invalid transaction Object'.
except
On e:Exception do
begin
dm.SQL_Conn.RollbackFreeAndNil(tran);
raise;
end;
end;
end;
----------------
方法二: 虽然执行不抱错,但是并没有回滚
var
tran:TTransactionDesc;
begin
try
tran.TransactionID:=1;
tran.IsolationLevel:=xilREADCOMMITTED;
dm.cds_DBXQuery.Close;
dm.cds_DBXQuery.CommandText:=xxx;
dm.cds_DBXQuery.Execute;
dm.SQL_Conn.Commit(tran);//替换成 dm.SQL_Conn.Rollback(tran);测试回滚,但遗憾的是没有报错也没有回滚
except
On e:Exception do
begin
dm.SQL_Conn.Rollback(tran);
raise;
end;
end;
end;
------解决方案--------------------
最好写在存储过程里面 在存储过程去回滚...
本来回滚就是因为数据连接有问题,你还在Delphi 里面回滚貌似不太好吧.
------解决方案--------------------
有可能BeginTransaction无效,
或者上个事务还没执行完,开始新事务前,最好先判断一下事务的状态
------解决方案--------------------
我的也是XE + sql2008,没有问题
- Delphi(Pascal) code
var Transaction: TDBXTransaction; OwnsTransaction: Boolean; OwnsTransaction := not Connection.InTransaction; if OwnsTransaction then Transaction := Connection.BeginTransaction; try ... if OwnsTransaction then Connection.CommitFreeAndNil(Transaction); except if OwnsTransaction then Connection.RollbackFreeAndNill(Transaction); end;
------解决方案--------------------
客户端回滚,如楼上的楼上onlyou13(流浪哥哥)提供的处理代码,
服务器存储过程回滚:
Create procedure [dbo].[XXXX]
(...)
AS
BEGIN TRAN
if (...)
begin
ROLLBACK TRAN
select 'Error!'
RETURN 1
end
......
SELECT '保存完成!'
COMMIT TRAN
RETURN 0