三层+DCOM+MSSQL怎么实现事务?(200分)

E

ego

Unregistered / Unconfirmed
GUEST, unregistred user!
如果我有两张单据表(a,b),a(主表)先存储,B(明细表)后存储。
现在问题是:如果A存储成功,然后存储B时发生错误,我想把A销掉。用事务进行控制该怎么做?
事务是写在数据库中(用触发器)好,还是写在应用服务器程序中好?还是写在客户端...
哈哈!TClientDataSet好象不能用事务吧?
如果是用角发器写在数据库中,请写个例子(MSSQL)。
我现在是把事务写在服务器中,实现方法在[TYPE LIBIRARY]中写一个接口过程(可能用词不当,还望指正),
在客户端发送开始,结束和滚回的消息,服务器端接收到了就进行事务处理。不知这样行不行?
我刚学三层,请多指教。
 
为什么没有人回答??????????
我可是在线等待呀!!!!!!!!!!
 
业务逻辑应该写在应用服务器里,而不应该写在客户端程序里,也就是说,业务逻辑中的事务
应用由应用服务器端的Dataset来处理,而不是由客户端的ClientDataset来处理。
比如说你在服务器的组件里添加一个方法,名为ChangeMyData(),可以这样处理:
//例:将TableA表中的记录移动到TableB表,如果记录在未被完整复制前失败,事务将回滚,
//两个表中的数据都将恢复原样
STDMETHODIMP TMyAppServerImpl::ChageMyData(BSTR UserName, int* Result)
{
TQuery *tqr;
tqr = m_DataModule->QR1;

//m_DataModule是由Transaction DataModule向导建立的事务数据模块
try{
m_DataModule->DB1->StartTransaction();
//开始事务
tqr->SQL->Clear();
//将TableA表的数据复制到TableB表中
tqr->SQL->Add("Insert Into TableB Select * From TableA Where UserName=:aUser");
tqr->Params->Items[0]->AsString = UserName;
tqr->ExecSQL();
//从TableA表中删除记录
tqr->SQL->Clear();
tqr->SQL->Add("Delete From TableA Where UserName=:aUser");
tqr->Params->Items[0]->AsString = UserName;
tqr->ExecSQL();
m_DataModule->DB1->Commit();
//提交事务
*Result = 0;
}catch(Exception &E){
if (m_DataModule->DB1->InTransaction)
m_DataModule->DB1->Rollback();
//事务回滚
*Result = -9;
return S_FALSE;
}
return S_OK;
}
//---------------------------------------------------------------------------
(抱歉,我使用了C++ Builder的代码,我现在的机器上没有装Delphi,但使用的原理是一
样的)
客户端只要调用组件的ChangeMyData方法,获取其返回值都可以了,而不用去操心事务的细节。
 
李维在他的书中就有介绍(<ADO/MTS/COM+高级程序设计>)
你可以用MTS来做,这个支持事物处理做成个有状态对象的就可以
 
在存储过程里通过事务来解决,效率很高
 
Sachow:
我原来用的就是你所用的方法,但是翻了好多书都没有说这样可以所以有些担心。今天看
你也这么用放心了[:)]。
goodzuoyu:
李维的书贵得离谱!我没买......只是每天跑去书店站着看(幸亏比较薄),
哈哈,书店的小姐都认得我了。
 
顶部