|
|
1
22
在SQL Server 2005中对错误处理进行了大规模升级。这些文章相当广泛: Error Handling in SQL 2005 and Later by Erland Sommarskog 和 Error Handling in SQL 2000 â a Background by Erland Sommarskog 最好的办法是这样: 创建存储过程如下:
但是,这仅适用于SQL Server 2005及更高版本。如果不使用SQL Server 2005中的Try-Catch块,则很难删除SQL Server返回的所有消息。这个
从 http://www.sommarskog.se/error-handling-I.html#trancount
如果不希望收到有关事务计数不匹配的警告,则每次只需要打开一个事务。您可以通过创建以下所有过程来完成此操作:
通过这样做,仅当您还没有在事务中时才发出事务命令。如果您以这种方式对所有过程进行编码,那么只有发出begin事务的过程或C代码才会实际发出commit/rollback,并且事务计数总是匹配的(您不会得到错误)。 在C语言中 TransactionScope Class Documentation :
只是一个想法,但是你可以使用
|
|
2
13
不在中使用事务 二者都 你的C代码 和 链轮。一个就够了。这几乎总是应该是您的C代码,只有它知道应该拒绝或提交对数据库的全部更新。 |
|
|
3
2
如果必须支持SQL Server 2000,请使用TransactionScope使您的生活更轻松。但是,请参阅底部了解它为什么有限制。 Try/Catch之前的SQL错误处理是错误的。KM发表的Erland文章解释了语句/作用域/批中止错误。基本上,代码可能只是停止执行,而您只剩下行上的锁等。 这就是上面发生的事情,所以您的回滚不会运行,所以您会得到关于事务计数的错误226。 如果您只支持SQL Server 2005+,那么请使用Try/Catch来捕获所有错误,并使用set xact_abort on。Try/Catch使SQL Server更具弹性,并捕获所有运行时错误。设置xact_abort on也会抑制错误226,因为它会自动发出回滚 和 确保释放所有锁。 顺便说一句: 选择1/0是一个很好的例子,说明了为什么应该使用SQL错误处理。 使用数据适配器填充
SQL Try/Catch将处理此问题… |
|
|
4
1
你应该试试看
这个问题应该回答你关于交易范围和回滚的问题 How does TransactionScope roll back transactions? |
|
5
0
|
|
|
6
-1
我知道这是一个非常普通的建议,但首先防止被零除不是一个很好的解决方案吗?几乎所有DML操作(insert、select、update)都可以重写,以避免在使用case语句时被零除。 |
|
|
Jake · 如何回滚臭鼬事务以进行集成测试?(缺少隐式原点) 1 年前 |
|
|
Riyaz Vagapov · EF核心交易 2 年前 |
|
|
M. Kemp · Oracle删除操作将永远存在 2 年前 |
|
Kuldeep · 我们什么时候应该在数据库中进行交易? 2 年前 |