Jan*_*Jan 3 .net c# sql-server ado.net sql-server-2012
我在负载测试场景下遇到了奇怪的行为:后端(sql server 2012)正在超载并且一些命令超时(这仍然是预期的,因为后端服务器是半故意慢的HW); 但我们的平台定期(越来越延迟)重试超时操作 - 并在几次重试后突然开始接收'无法插入重复键'SqlException.
我验证只能生成具有特定唯一键的单行并尝试插入(第一次插入并且所有可能的重试始终在同一线程上进行).
我还修改了SP,以便它使用显式事务:
BEGIN TRY
BEGIN TRANSACTION;
-- Insert into table A
-- Insert into table B
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
THROW
END CATCH
Run Code Online (Sandbox Code Playgroud)
但问题仍然存在.
有什么想法可以发生这种情况吗?
如何找出超时的来源(后端与客户端)?
有没有办法确保操作成功完成或失败(基本上是事务 - 但可能来自客户端代码)?
EDIT01: 我认为解决这个问题的一种方法是利用ado.net集成SQL服务器分布式事务 - 例如:
using (TransactionScope scope = new TransactionScope())
{
//Perform the sql commands
//if above statements throws (e.g. due to timeout) - than the transaction is not commited and it will be rolled back
scope.Complete()
}
Run Code Online (Sandbox Code Playgroud)
但是:我同意它只会增加复杂性并且可能仍然反对同一个问题(usr概述的两个将军问题).因此,最好的方法可能是编写客户端和服务器端的代码来依赖这样的选项 - 再次由usr在他的回答中指出
| 归档时间: |
|
| 查看次数: |
1240 次 |
| 最近记录: |