调用MIDAS的自定义接口,MS SQL事务与连接数问题! ( 积分: 100 )

  • 主题发起人 主题发起人 rikhong
  • 开始时间 开始时间
R

rikhong

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端调用服务端的接口:
SocketConnection1.AppServer.setData(updatestr,v);
服务端使用MIDAS技术,一个ADO连接MS SQL,接口:
procedure Trikserver.setdata(const SqlStr: WideString;
out insertOK: OleVariant);
begin
try
with ADOQuery1do
begin
sql.Text:=SqlStr;
ExecSQL;
end;
insertOK:=1;
except
insertOK:=0;
end;
end;
问题:
客户端A 调用该接口并开始一个事务,执行相关SQL语句,这时如果客户端B插进来,也调用改接口执行SQL语句,如果客户端A的事务回滚了,是不是把B执行过的语句也回滚了?
,SQL是根据连接数来处理事务的,现在需要确认的是两个客户端同时使用一个ADO去连接数据库,SQL是把他们看做一个连接还是两个连接?
 
当然是两个连接了,这是服务端处理并发的客户端的问题,别扯到服务器去。
 
那么如果A调用接口不是一步到位,我可能是这样:
A调用:SocketConnection1.AppServer.setData('begin
TRANSACTION',v);
A调用:SocketConnection1.AppServer.setData('一些插入或修改语句',v);
A调用:SocketConnection1.AppServer.setData('一些插入或修改语句',v);
这时候 B调用:SocketConnection1.AppServer.setData('begin
TRANSACTION',v);
SocketConnection1.AppServer.setData('一些插入或修改语句',v);
A调用:SocketConnection1.AppServer.setData('COMMIT',v);
这样的话会怎么样?
 
肯定是这样的,事务回退,更新肯定回退
 
ycluo,:
以上面的例子,B所执行的语句会怎么样?
 
每次开启事务 客户端向服务器传唯一参数guid 把这个唯一的字串 存在服务器上
然后 A每次操作 都把这个字串 提交上来 比对一下就OK
procedure Trikserver.setdata(const SqlStr: WideString;
guid: Tguid
out insertOK: OleVariant);
 
只要最外层的事务没有提交,数据就没有写入到库,最外层的事务rollback,则里层事务已经提交的,也要rollback
 
我也觉得应该是这样,我做了个测试:
我这里使用了两个SocketConnection1,SocketConnection2,结果是A没插入,B成功插入了。我想如果使用一个SocketConnection1的话应该和你说的情况一样。这么说数据库接受了两个连接数。而并不是事务嵌套!如果是一个SocketConnection1就是事务嵌套,不知道这样说对不对?
我觉得纳闷的是:服务端我只用一个ADO连接MS SQL 数据库,MS SQL是怎么知道有多少个SocketConnection1连接上来的?
A调用:SocketConnection1.AppServer.setData('begin
TRANSACTION',v);
A调用:SocketConnection1.AppServer.setData('插入一条数据A,v);
这时候 B调用:SocketConnection2.AppServer.setData('begin
TRANSACTION',v);
SocketConnection2.AppServer.setData('插入一条数据B',v);
A调用:SocketConnection1.AppServer.setData('rollback',v);
B调用:SocketConnection2.AppServer.setData('COMMIT',v);
 
事务只放到中间层,客户端是不能放的
 
要看你的应用服务器是什么线程模型的。如果是每个连接客户开启一个服务器实例,那么就是独立的多个ADO连接了,事务处理当然是独立的。
 
接受答案了.
 
后退
顶部