- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我们遇到了一个非常有趣的问题,它与 SQL 事务超时有关。出于问题的考虑,超时的语句并不重要,但它是单个 INSERT 语句,没有显式事务,客户端生成的 GUID 作为键:
INSERT MyTable
(id, ...)
VALUES (, ...)
我们还有一个就地重试策略,因此如果命令因 SqlException 而失败,则会重试。 SQL Server (Azure SQL) 有一天没有正常运行,我们在重试期间遇到了很多奇怪的 PK 违规错误。它们是由 重试 实际上成功提交 SQL Server 事务引起的(因此导致使用已获取的 ID 进行插入)。我知道 SQL 超时是 purely client side concept ,所以如果客户端认为 SqlCommand 失败了 - 它可能是也可能不是是这个意思。
我怀疑客户端显式事务控制(例如,如下所示使用 TransactionScope
包装语句)将解决 99% 的此类问题——因为 Commit 实际上是非常快速且廉价的操作。但是,我仍然看到那里的警告——超时也可能发生在提交阶段。应用程序可能再次处于无法猜测事务是否真正提交的情况(以确定重试的必要性)。
问题是如何以防弹(针对此类麻烦)和通用方式编写代码,并且仅在确定事务未提交时才重试。
using (var trx = new TransactionScope())
using (var con = GetOpenConnection(connectionString))
{
con.Execute("");
// what if Complete() times out?!
// to retry or not to retry?!
trx.Complete();
}
1 Câu trả lời
问题是异常并不意味着交易失败。对于任何补偿操作(如重试),您需要有明确的方法来判断它是否失败。我的建议存在可扩展性问题,但技术才是最重要的,可扩展性问题可以通过其他方式解决。
我的解决方案;
关于c# - 解决 SQL 事务超时的防弹方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40727012/
每个人都知道我们应该始终使用 DOM 技术而不是正则表达式来从 HTML 中提取内容,但我觉得我永远不能相信 SimpleXML 扩展或类似的扩展。 我现在正在编写一个 OpenID 实现,我尝试使用
我最近开始致力于创建电子邮件模板,遇到了一些我找不到任何解释的问题。 我从 buttons.cm 生成了按钮,期望它们是防弹的,虽然它们对大多数客户端都很好,但它们在基于 Web 的 outlook
重新审视 C++ 中的生命周期扩展,我发现有一些模式破坏了 C++ 表达式的“可分解性”。例如,以下两个 block 是一个 valid C++ code : class NonMovable { p
我正在开发一个可以通过用户提供的 Groovy 脚本扩展的服务器应用程序。很明显,我想确保这些脚本在一个非常紧凑的沙箱中运行,在沙箱中它们不会破坏核心应用程序代码或消耗太多资源而使服务器过载。 我研究
Tôi là một lập trình viên xuất sắc, rất giỏi!