稍后创建数据库事务和 commit/rollback

Create database transaction and commit/rollback later

我们可以稍后再创建数据库事务和 commit/rollback。我的意思是我们不 committing/rollback 同时 machine/host/server。假设我们 return 事务并让其他人根据事务 ID 决定提交或回滚。我们如何在 Go 和 sql 库中做到这一点?

没有

一个事务允许以原子方式执行一系列命令,例如,没有另一个命令获取更新一半的数据,并且没有另一个命令更改一系列命令中的基础数据。

这是你想要结束并快速完成的事情,因为它们锁定了底层 tables。

想象一下,如果您的事务是向 Table A 中插入一行。您启动事务,插入行,然后不提交或回滚。在您这样做之前,其他人不能使用 Table A(特殊情况除外)。他们会坐在那里等待(阻塞)。如果并发事务试图以不同的顺序将数据放入 tables,您也可能会遇到死锁 - 其中事务在没有用户输入的情况下自动回滚。

Brent Ozar explaining and showing deadlocks 有一个很棒的视频 - 值得单独观看,但也演示了如果您不提交交易会发生什么。

如果您想要一个排队或批准更改的机制,您将需要固有地构建它,例如,

  • 将更改放入 'queue' 稍后完成,或者
  • 进行数据更改,但在相关 table(s) 的列中将它们标记为 'draft'。然后,您的其余代码必须包括他们是否要包含草稿数据。

tl;dr 版本:数据库中的事务是一项 data-level 功能,可确保您的数据一致。使用 approval/etc 是在业务逻辑级别。