请关注 ADO Transaction 问题

xmlingo 2001-12-26 12:36:04
系统技术结构是 :
DB+COM+WEB(SYBASE +ODBC +ADO+IIS5+IE 服务器 WIN2000)
COM中采用了ADO的Transaction ,当两个用户同时提交运行这个COM时直接其中一个进程超时,另外一个才会执行(超时之前 任务管理器中,CPU使用率<3%,一个进程停止之后CPU使用率>90%),
主要程序:

implements COM
Function SaveData()
Dim DataConnect as new ADODB.connection
......
DataConnnect.BeginTrans
ON ERROR GOTO ERROR_HANDEL:
........
DataConnect.Excute (.....) 'eg. UPATE DELETE SELECT INSERT
........
DataConnect.CommitTrans
Exit function
ERROR_HANDEL:
dataconnect.Rollback
END Function

implements COM
Function SaveData()
Dim DataConnect as new ADODB.connection
......
DataConnnect.Excute "BEGIN TRANSACTION", 0, adCmdText
ON ERROR GOTO ERROR_HANDEL:
........
DataConnect.Excute (.....) 'eg. UPATE DELETE SELECT INSERT
........
DataConnect.Execute "COMMIT", 0, adCmdText
Exit function
ERROR_HANDEL:
DataConnect.Execute "ROLLBACK", 0, adCmdText

END Function
这两种写法都会出现这种情况



...全文
116 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jett 2002-03-04
  • 打赏
  • 举报
回复
我怀疑你的问题,可能是出现了死锁
jett 2002-03-04
  • 打赏
  • 举报
回复
关于mts与sqlserver的transaction
from :
ftp://ftp.microsoft.com/bussys/viper/docs/faq%20mts%20databases%20and%20transactions.htm#_Transactions
4.11 Can SQL Server transactions be used with Microsoft Transaction Server transactions?
Components can call BEGIN TRANSACTION, COMMIT TRANSACTION, or ROLLBACK TRANSACTION inside a transactional MTS component, although this is not recommended.

Calls to BEGIN TRANSACTION are ignored, as are calls to COMMIT TRANSACTION.

Calls to ROLLBACK TRANSACTION will abort the component's transaction even if the component calls SetComplete.

Components must not call BEGIN DISTRIBUTED TRANSACTION, PREPARE TRANSACTION, or SAVE TRANSACTION inside a transactional MTS component.

螺丝刀2000 2002-03-03
  • 打赏
  • 举报
回复
看不见啊!可可。
Bardo 2002-03-03
  • 打赏
  • 举报
回复
com上可以使用事务,但Com中首先要封装数据库链接
即从不创建新有链接,只用一个链接
只有在必要时再开一个专用于事务的链接。
象你的代码实际只要一个公用链接即足够!
同时链接的游标要设为客户端
你好象也没有这么做!
再有
使用事务时最好不要用缺省超时(15秒处理事务通常是不够的)
你也没有这么做!
所以。。。。。


(不过,菜鸟的看法仅供参考)(不过,菜鸟的看法仅供参考)

xmlingo 2002-03-03
  • 打赏
  • 举报
回复
gogogo
xmlingo 2002-01-11
  • 打赏
  • 举报
回复
upupup
xmlingo 2001-12-29
  • 打赏
  • 举报
回复
go
xmlingo 2001-12-27
  • 打赏
  • 举报
回复
upupupup
xmlingo 2001-12-27
  • 打赏
  • 举报
回复
to bucher(bucher):
大概您是对的,COM+中不能使用ADO事务
我再查查资料

您说
>>DataConnnect.Excute "BEGIN TRANSACTION", 0, adCmdText
>>仅仅是一句SQL语句,在这句语句执行完毕后你的事物也就结束了。
如果是没有启动事务或者事务马上结束,哪不知为什么用这种写法与用ADO事务写法都会产生事务挂起的后果,我试过如果取消事务(包括ADO 和 BEGIN TRANSACTION)则运行很顺畅
所以我想BEGIN TRANSACTION还是起了事务的作用的,不知您是否同意我的看法?

另外请告知你的贴子的地址

to ferrytang(ferry)及junglerover(灌木丛) 
Sorry !没执行Connection.close 问题太低级了
是我程序没贴全,仅是例子而已,再说了,如果是Connection.close 问题不会出现这种情况的.
谢谢您
yuminggang 2001-12-27
  • 打赏
  • 举报
回复
1 在COM+可以使用ADO事务。
2 Dim DataConnect as new ADODB.connection,把这样的定义语句放在这里是很不合适的。
3 在MTS中你最好始终保持一个公用的连接对象,不要谁都可以创建。应该和客户端分开来。
4 可以把这种对数据的操作放在存储过程中。毕竟是数据服务端的事。
5 如果你认准了ADO,建议你一定要使用SQL DMO,检验一下DATA SERVER中的事务情况,发现问题,马上KILL,否则DATA SERVER会死的。

xmlingo 2001-12-27
  • 打赏
  • 举报
回复
没有人懂吗?
junglerover 2001-12-26
  • 打赏
  • 举报
回复
我估计是这样的

你的连接最后没有关啊,两段程序最后都少了一个
DataConnect.close,
一段时间后会越来越多的
最后达到了服务器允许的最大连接数,新的连接当然就打不开了
只有等到原有的超时了,断了以后……
才能打开一个连接
bucher 2001-12-26
  • 打赏
  • 举报
回复
在COM+中不要使用ADO事务,MS非常强调这一点,这会破坏COM+的事物完整性。
COM+中应该使用ObjectContext对象来进行事务处理。
btw:
DataConnnect.Excute "BEGIN TRANSACTION", 0, adCmdText
仅仅是一句SQL语句,在这句语句执行完毕后你的事物也就结束了。如果你希望程序中使用SQL自己的事物可以这样写:
DataConnnect.Excute "BEGIN TRANSACTION ............ commit tran" , 0, adCmdText

如果你对我的回答满意,请在我的那个求网页素材的贴子多捧捧场,。
ferrytang 2001-12-26
  • 打赏
  • 举报
回复
同意楼上的说法,ado有这个问题的!
junglerover 2001-12-26
  • 打赏
  • 举报
回复
老兄,你每次都定义了一个新的连接,最后确实没有关啊。

不过你说得对,你当然不是菜鸟了,你哪里是菜鸟?
我才是,我才是。
xmlingo 2001-12-26
  • 打赏
  • 举报
回复
upupup
xmlingo 2001-12-26
  • 打赏
  • 举报
回复
to junglerover(灌木丛):
谢谢您,可能您不了解事务,如果你不是专家,请不要把我当菜鸟
这个问题与用DAO +ODBC 的Transaction 问题类似

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧