(转载)使用ADOConnet.BeginTrans后,出现错误提示:无法在此会话中启动更多的事务?
2013-10-16 23:07
525 查看
Q:
三层结构,在服务器端使用adoconnection连接到sqlserver2000,然后想在
datasetprovider的beforupdaterecord中使用语句:
try
adoconnection.begintrans; //这一句出错,错误信息如下
....
adoconnection.committrans;
except
....
end
错误信息如下:
无法在此会话中启动更多的事务
我在启用adoconnection.begintrans前判断adoconnection.InTransaction是false,
为什么会出现这个错误?
A:
只有一种情况会发生搂主的这种现象,即在一个事务未完成时,又启用了另一个事务。即在代码连接时有出现:
adoconnection.begintrans;
....
adoconnection.begintrans;
....
这种情况下,会发生报错。所以要保证begintrans和committrans或rollbacktrans成对出现,尤其是在try语句中。
A:DSP 在更新数据时会自动启动事务?!
A:
首先你的数据库不支持嵌套事务!
其次,在单事务情况下:
try
ADOConnection.BeginTrans;
....
ADOConnection.CommitTrans;
except
ADOConnection.RollbackTrans;
end;
必须成套出现。
最后,可以在开始事务前调用ADOConnection1.InTransaction来判断
A:
楼上的“你的数据库不支持嵌套事务“,我不同意这样的说法,SQL Server和Oracle中都是支持嵌套事务的,但在Delphi应用中同样会出现这样的报错,其根本原因并不是数据库引起的,而是在于Delphi本身。只能说Delphi不支持事务嵌套。
在Delphi中使用事务机制不如在应用服务器端使用好,搂主可以将SQL部分改为存储过程以事务实现会来的简洁而高效。
A:
3楼比较靠谱。
数据库本身支持嵌套事务可数据访问引擎没实现此功能,等于还是没有。
把业务逻辑在APPSERVER的代码和DATASERVER的SP,VIEW中散布,升级及维护会很麻烦。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
A:
程序不用编写嵌套事务,编程方式的问题
A:
那是因为你的上一次事务没有回滚!!!
A:
datasetprovider本身自带事务功能了........
A:
因为在分布式的远程数据摸板的创建时,是系统默认的方式:为每个客户开启一个独立的线程都共享一个数据连接,所以此时要是有两个或两个以上的客户线程同时启动事务,应用层就会出现“无法在此会话中启动更多的事务”的错误,而客户端会出现:“不能手工或自动在分布式下创建新的连接”
A:
如果是datasetprovider本身自带事务功能,那么怎样将这个事备用起来,或者将它屏蔽掉呢。
其实我在这几天的测试过程中,发现datasetprovider确实自带事务功能了
A:
应该转换思路了。
我找到解决的办法了。
ADOConnection.BeginTrans;在beforeapplyupdate中使用
ADOConnection.CommitTrans;在afterapplyupdate
ADOConnection.RollbackTrans;在applyupdateerr发生错误中使用
三层结构,在服务器端使用adoconnection连接到sqlserver2000,然后想在
datasetprovider的beforupdaterecord中使用语句:
try
adoconnection.begintrans; //这一句出错,错误信息如下
....
adoconnection.committrans;
except
....
end
错误信息如下:
无法在此会话中启动更多的事务
我在启用adoconnection.begintrans前判断adoconnection.InTransaction是false,
为什么会出现这个错误?
A:
只有一种情况会发生搂主的这种现象,即在一个事务未完成时,又启用了另一个事务。即在代码连接时有出现:
adoconnection.begintrans;
....
adoconnection.begintrans;
....
这种情况下,会发生报错。所以要保证begintrans和committrans或rollbacktrans成对出现,尤其是在try语句中。
A:DSP 在更新数据时会自动启动事务?!
A:
首先你的数据库不支持嵌套事务!
其次,在单事务情况下:
try
ADOConnection.BeginTrans;
....
ADOConnection.CommitTrans;
except
ADOConnection.RollbackTrans;
end;
必须成套出现。
最后,可以在开始事务前调用ADOConnection1.InTransaction来判断
A:
楼上的“你的数据库不支持嵌套事务“,我不同意这样的说法,SQL Server和Oracle中都是支持嵌套事务的,但在Delphi应用中同样会出现这样的报错,其根本原因并不是数据库引起的,而是在于Delphi本身。只能说Delphi不支持事务嵌套。
在Delphi中使用事务机制不如在应用服务器端使用好,搂主可以将SQL部分改为存储过程以事务实现会来的简洁而高效。
A:
3楼比较靠谱。
数据库本身支持嵌套事务可数据访问引擎没实现此功能,等于还是没有。
把业务逻辑在APPSERVER的代码和DATASERVER的SP,VIEW中散布,升级及维护会很麻烦。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
A:
程序不用编写嵌套事务,编程方式的问题
A:
那是因为你的上一次事务没有回滚!!!
A:
datasetprovider本身自带事务功能了........
A:
因为在分布式的远程数据摸板的创建时,是系统默认的方式:为每个客户开启一个独立的线程都共享一个数据连接,所以此时要是有两个或两个以上的客户线程同时启动事务,应用层就会出现“无法在此会话中启动更多的事务”的错误,而客户端会出现:“不能手工或自动在分布式下创建新的连接”
A:
如果是datasetprovider本身自带事务功能,那么怎样将这个事备用起来,或者将它屏蔽掉呢。
其实我在这几天的测试过程中,发现datasetprovider确实自带事务功能了
A:
应该转换思路了。
我找到解决的办法了。
ADOConnection.BeginTrans;在beforeapplyupdate中使用
ADOConnection.CommitTrans;在afterapplyupdate
ADOConnection.RollbackTrans;在applyupdateerr发生错误中使用
相关文章推荐
- IIS出现错误“无法使用已在使用中的标识启动新的会话”
- IIS出现错误“无法使用已在使用中的标识启动新的会话”
- IIS出现错误“无法使用已在使用中的标识启动新的会话”
- Android开发之旅:环境搭建及HelloWorld (AVD无法启动,出现Starting emulator for AVD '2.2' PANIC: Could not open: 错误提示)
- VS调试出现错误提示 无法将“obj\Debug\*.*”复制到“bin\Debug\*.*”,文件正在由另一个进程使用,因此该进程无法访问此文件
- 启动IIS 网站出现错误 另一个程序正在使用此文件,进程无法访问
- 异常解决:Hadoop启动出现ssh无法解析主机名等错误提示
- 解决Win7 64bit + VS2013 使用opencv时出现提“应用程序无法正常启动(0xc000007b)”错误
- MySQL安装过程中,使用net start mysql命令,出现 服务正在启动 服务无法启动 服务没有报告任何错误 的问题
- 使用javah出现无法访问的错误!(转载)
- sql 2008 :提示出现错误1069,由于登陆失败而无法启动服务
- 本地无法启动MySQL服务,出现1067错误提示
- 解决Win7 64bit + VS2010 使用opencv时出现提“应用程序无法正常启动(0xc000007b)”错误
- sql2000中删除用户出现错误提示: 因为选定的用户拥有对象,所以无法除去该用户(转载)
- 转载:使用win pe模式安装win7的时候出现“安装程序无法定位现有系统分区,也无法创建新的系统分区”提示
- SQLServer出现 '其他会话正在使用事务的上下文' 的问题原因,什么是环回链接服务器?(转载)
- eclipse 无法启动AVD,出现Starting emulator for AVD '' PANIC: Could not open: 错误提示的解决办法
- 启动SQL Server 2005 配置管理器时,出现以下提示错误,无法连接到WMI提供程序。您没有权限或者该服务器无法访问
- 启动IIS 网站出现错误 另一个程序正在使用此文件,进程无法访问
- IIS出现“另一个程序正在使用此文件,进程无法访问。”错误提示的解决办法