我正在用C ++编写SQL Server数据库。我有一个名为SQLTransaction
的对象,当在代码块的开头创建时,发送' begin transaction'到SQL Server。
然后我将一个或多个SQL语句发送到服务器。如果一切顺利,我在SQLTransaction
对象中设置一个标志,让它知道命令集顺利。当SQLTransaction
对象超出范围时,它会发送提交事务'或者'根据标志的状态回滚事务到服务器。
它看起来像这样:
{
TSQLTransaction SQLTran();
try
{
Send( SomeSQLCommand );
}
catch(EMSError &e)
{
InformOperator();
return;
}
SQLTran.commit();
}
我在其中一个块中发送了一条SQL语句,发送了一个糟糕的命令,并且该命令引发了SQL错误8114
将数据类型varchar转换为数字
时出错
我已经解决了这个问题。我不明白的事实是我还收到了第二条SQL错误消息
ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION。
我无法找到任何告诉我此事务在失败后可以或不应该回滚的事情。
这个完全相同的SQLTransaction
对象在我的应用程序的许多地方使用,并且似乎总是正常工作到现在为止。出于某种原因,这个SQL错误似乎被区别对待。是否存在SQL Server自动回滚的错误?我真的很想了解这里发生了什么。
由于
答案 0 :(得分:0)
有一个连接选项SET XACT_ABORT,它确定SQL语句抛出错误时当前事务的命运。基本上,当设置为OFF
时,事务(通常)会存活并继续执行;如果它是ON
,则回滚当前连接中所有已打开的事务并终止批处理。
可以设置选项:
检查最近是否有任何改变。此外,如果您在SQL事件探查器中捕获跟踪,那么" ExistingConnection"事件列出当前连接设置。您可以随时检查选项状态,并在关闭时将其排除在外。在这种情况下,我会仔细查看跟踪,可能会有其他命令发送到服务器,这些命令从您的客户端代码中显而易见。