L
ls2000
Unregistered / Unconfirmed
GUEST, unregistred user!
1、事物管理
假设有下列三个mts组件,mtscord,mtswork,mtsemployee
在mtscord中有一方法如下
procedure Tmtscord.updatedat(var vdat1,vdat2levariant);
var
mtswork:Imtswork;
mtsemployee:Imtsemployee;
begin
try
olecheck(objectcontext.createinstance(class_mtswork,IID_imtswork,mtswork));
mtswork.updatedat1(vdat1);//更新数据
olecheck(objectcontext.createinstance(class_mtsemployee,IID_imtsemployee,mtsemployee));
mtsemployee.updatedat1(vdat2);//更新数据
setcomplete;
except
setabort;
end;
end;
mts四种事务模式,a 需要事务 b 需要新事务
c 支持事务 建议使用:支持事务,
那下面的情形
mtscord事务 mtswork事务 mtsemployee事务 vdat1、vdat2更新
A a或者b c c 应该受同一事务保护,是吗?
B c c c 会受同一事务保护吗?
C c b c mtswork的事务会传递给mtsemployee吗?
如果B、C没有受到事务保护,该怎么编代码解决呢?需要Itransactioncontextex吗?
2、是否一个组件所有的方法都受事务保护,如mtswork为需要事务
客户端
try
olecheck(objectcontext.createinstance(class_mtswork,IID_imtswork,mtswork));
mtswork.updatedat1(vdat1);//更新数据
(mtswork as Iappserver).as_applyupdates('dspwork',vdat1,0,iErrorcount,Ownerdata);
setcomplete;
except
setabort;
end;
这样AS_applyupdates是否也受与updatedat1同一事务保护?
3、midas在mts中
通过修改comobj,provider部分代码,利用dcomconnection与clientdataset连接
mts,dcomconnection会自动建立mts对象
设四个mts对象mtsquery(查询,支持事务) mtsbook(支持事务)
mtspublisher(支持事务) mtsupdate(需要事务)
mtsbook、mtspublisher分别由adoconnetion、adodataset、datasetprovider组成
mtsquery利用两个dcomconnection与clientdataset连接mtsbook与mtspublisher
mtsquery其中一方法
procedure Tmtsquery.GetBookPublisher(var vdat1,vdat2levariant);
begin
try
try
FdataModu.cdsBook.active:=True;
vDat1:=FdataModu.cdsBook.data;
FdataModu.cdspublisher.active:=True;
vDat2:=FdataModu.cdspublisher.data;
setcomplete;
except
setabort;
end;
finally
FdataModu.cdsBook.active:=False;
FdataModu.cdspublisher.active:=False;
end;
end;
上面的代码会受到事务保护吗?(查询数据,没有事务开销更好,是吧?)
mtsupdate利用两个dcomconnetion分别连接mtsbook、mtspublisher,其中一方法如下
procedure TmtsUpdate.updateDates(vdat1,vdat2levariant;imaxError:integer;
var iErrorcount:integer);
var
ownerdatalevariant;
begin
try
(Fdatamodu.dcombooks.appserver as Iappserver).as_applyupdates('dspBooks',
vdat1,iMaxError,iErrorcount,ownerdata);
(Fdatamodu.dcompublisher.appserver as Iappserver).as_applyupdates('dsppublisher',
vdat1,iMaxError,iErrorcount,ownerdata);
setcomplete;
except
setabort;
end;
end;
这样对dspbooks与dsppublisher的更新应该会受到同一事务的保护?要是mtsupdate为支持事务模式,
客户端怎么把事务context传递给dcomconnetion呢?
4、少量多次存取问题
按书中原程序,mts模块的adodataset为
select Top 5 * from employee where emp_id>:id order by Emp_id
客户端的clientdataset的packetrecords为5
客户程序第一次建立连接时,总是取得重复的数据;并且按“more”取得下一笔数据时,显示
不正常,我在“more”中存取下一笔数据时,加上clientdataset1.refresh这样只有第一次连
接取得10条数据(5条重复的),按datasetnavigator的refresh后,显示正常(5条数据),
按”more“也正常。不知是什么原因?另外若修改了其中的数据,取下一笔数据回出现错误,
提示先更新数据applyupdate?程序中的adoquery好象有些问题,用adodataset就好了。
5、改造自己的delphi
按书中修改了好几处地方,(comobj.pas adodb.pas provider.pas 也可修改consts.pas中
的提示信息),可以把上述代码拷贝到当前的工程目录下这样连接编译时会首先使用修改过的
unit;或者把上面的pas文件和dcu文件拷贝到/bin/vcl下面。我提出第三种建议,把修改过
的单元pas与dcu拷贝到一个目录d:/vclcust(随意),然后在delphi ide中”tools“-》环境
设置-》lib path加入上面的目录路径,并提到第一位,然后在browser path中同样设置,这
样每次编译时,首先找到的是自己修改过的unit。若不要这些修改的时候,删除目录中的文件
或者改名(注意不要与/bin/vcl或其他的unit同名),delphi又还原本来面目。
假设有下列三个mts组件,mtscord,mtswork,mtsemployee
在mtscord中有一方法如下
procedure Tmtscord.updatedat(var vdat1,vdat2levariant);
var
mtswork:Imtswork;
mtsemployee:Imtsemployee;
begin
try
olecheck(objectcontext.createinstance(class_mtswork,IID_imtswork,mtswork));
mtswork.updatedat1(vdat1);//更新数据
olecheck(objectcontext.createinstance(class_mtsemployee,IID_imtsemployee,mtsemployee));
mtsemployee.updatedat1(vdat2);//更新数据
setcomplete;
except
setabort;
end;
end;
mts四种事务模式,a 需要事务 b 需要新事务
c 支持事务 建议使用:支持事务,
那下面的情形
mtscord事务 mtswork事务 mtsemployee事务 vdat1、vdat2更新
A a或者b c c 应该受同一事务保护,是吗?
B c c c 会受同一事务保护吗?
C c b c mtswork的事务会传递给mtsemployee吗?
如果B、C没有受到事务保护,该怎么编代码解决呢?需要Itransactioncontextex吗?
2、是否一个组件所有的方法都受事务保护,如mtswork为需要事务
客户端
try
olecheck(objectcontext.createinstance(class_mtswork,IID_imtswork,mtswork));
mtswork.updatedat1(vdat1);//更新数据
(mtswork as Iappserver).as_applyupdates('dspwork',vdat1,0,iErrorcount,Ownerdata);
setcomplete;
except
setabort;
end;
这样AS_applyupdates是否也受与updatedat1同一事务保护?
3、midas在mts中
通过修改comobj,provider部分代码,利用dcomconnection与clientdataset连接
mts,dcomconnection会自动建立mts对象
设四个mts对象mtsquery(查询,支持事务) mtsbook(支持事务)
mtspublisher(支持事务) mtsupdate(需要事务)
mtsbook、mtspublisher分别由adoconnetion、adodataset、datasetprovider组成
mtsquery利用两个dcomconnection与clientdataset连接mtsbook与mtspublisher
mtsquery其中一方法
procedure Tmtsquery.GetBookPublisher(var vdat1,vdat2levariant);
begin
try
try
FdataModu.cdsBook.active:=True;
vDat1:=FdataModu.cdsBook.data;
FdataModu.cdspublisher.active:=True;
vDat2:=FdataModu.cdspublisher.data;
setcomplete;
except
setabort;
end;
finally
FdataModu.cdsBook.active:=False;
FdataModu.cdspublisher.active:=False;
end;
end;
上面的代码会受到事务保护吗?(查询数据,没有事务开销更好,是吧?)
mtsupdate利用两个dcomconnetion分别连接mtsbook、mtspublisher,其中一方法如下
procedure TmtsUpdate.updateDates(vdat1,vdat2levariant;imaxError:integer;
var iErrorcount:integer);
var
ownerdatalevariant;
begin
try
(Fdatamodu.dcombooks.appserver as Iappserver).as_applyupdates('dspBooks',
vdat1,iMaxError,iErrorcount,ownerdata);
(Fdatamodu.dcompublisher.appserver as Iappserver).as_applyupdates('dsppublisher',
vdat1,iMaxError,iErrorcount,ownerdata);
setcomplete;
except
setabort;
end;
end;
这样对dspbooks与dsppublisher的更新应该会受到同一事务的保护?要是mtsupdate为支持事务模式,
客户端怎么把事务context传递给dcomconnetion呢?
4、少量多次存取问题
按书中原程序,mts模块的adodataset为
select Top 5 * from employee where emp_id>:id order by Emp_id
客户端的clientdataset的packetrecords为5
客户程序第一次建立连接时,总是取得重复的数据;并且按“more”取得下一笔数据时,显示
不正常,我在“more”中存取下一笔数据时,加上clientdataset1.refresh这样只有第一次连
接取得10条数据(5条重复的),按datasetnavigator的refresh后,显示正常(5条数据),
按”more“也正常。不知是什么原因?另外若修改了其中的数据,取下一笔数据回出现错误,
提示先更新数据applyupdate?程序中的adoquery好象有些问题,用adodataset就好了。
5、改造自己的delphi
按书中修改了好几处地方,(comobj.pas adodb.pas provider.pas 也可修改consts.pas中
的提示信息),可以把上述代码拷贝到当前的工程目录下这样连接编译时会首先使用修改过的
unit;或者把上面的pas文件和dcu文件拷贝到/bin/vcl下面。我提出第三种建议,把修改过
的单元pas与dcu拷贝到一个目录d:/vclcust(随意),然后在delphi ide中”tools“-》环境
设置-》lib path加入上面的目录路径,并提到第一位,然后在browser path中同样设置,这
样每次编译时,首先找到的是自己修改过的unit。若不要这些修改的时候,删除目录中的文件
或者改名(注意不要与/bin/vcl或其他的unit同名),delphi又还原本来面目。