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,没有问题
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