【发布时间】:2017-06-30 03:38:59
【问题描述】:
我正在用 C++ 编写一个 SQL Server 数据库。我有一个名为SQLTransaction 的对象,当它在代码块的开头创建时,它会将“开始事务”发送到 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 会自动回滚一些错误吗?我真的很想了解这里发生了什么。
谢谢
【问题讨论】:
-
为什么不能把事务逻辑放在SQL语句里面?