我不仅在一个地方看到这句话:
“事务应尽可能短,以避免并发问题,并启用最大数量的正提交。”
这究竟意味着什么?
现在让我感到困惑,因为我想在我的应用程序中使用事务,这些事务在正常情况下会同时处理来自许多客户端的数百行的插入。
例如,我有一个公开方法的服务:AddObjects(List<Objects>)
当然这些对象包含其他嵌套的不同对象。
我正在考虑为来自客户端的每个调用启动一个事务,执行适当的操作(每个对象及其嵌套对象的插入/更新/删除一堆)。 EDIT1:我的意思是整个“AddObjects
”调用的事务,以防止未定义的状态/行为。
我走向错误的方向吗?如果是的话,你会怎么做?你的建议是什么?
EDIT2:此外,我了解到批量交易的交易速度很快,但它与引用的句子在某种程度上相矛盾。结论是什么?
提前致谢!
答案 0 :(得分:3)
该建议最好理解为不允许在交易中进行用户互动。如果您需要在交易期间询问用户,请回滚,询问并再次运行。
除此之外,每当您需要确保原子性时,请使用交易 它们可能导致“并发问题”不是事务问题,而是数据库可能需要更多思考,更好的索引集或更标准化的数据访问顺序。
答案 1 :(得分:3)
交易必须涵盖业务特定的工作单元。它与通用“对象”无关,必须始终以域特定术语表示:“帐户X的借方和帐户Y的贷方必须在交易中”,“库存项目和销售的减去必须在交易中” '等等。必须一起成功或一起失败的一切都必须在交易中。如果你是一个“向列表添加对象是一个事务”的抽象路径,那么是的,你走错了路。由对象保存触发的所有插入/更新/删除都在事务中的事实不是目的,而是副作用。正确的语义应该是“对象X的更新和对象Y的更新必须在事务中”。即使是对单个“对象”进行更新的退化情况,仍应根据域特定术语来考虑。
答案 2 :(得分:1)
“事务应尽可能短,以避免并发问题并启用最大数量的正提交。”
交易保持打开的时间越长,锁定其他交易所需资源的可能性就越大。此阻塞将导致其他并发事务等待资源(或根据设计失败)。
Sql Server通常设置为自动提交模式。这意味着每个sql语句都是一个独特的事务。很多时候,您希望使用多语句事务,以便提交或回滚多个更新。更新时间越长,其他交易就越有可能发生冲突。