使用事务但实际上不进行任何查询是否会产生资源成本?

Does using a transaction but not actually making any queries have a resource cost?

好的,我们的一位团队成员建议,在每个 http 请求的开始,我们开始一个数据库事务(我们使用 Entity Framework 核心),完成请求的工作,然后完成如果响应为 200 Ok,则为事务处理,如果为其他响应,则回滚。

这意味着我们只会提交成功的请求。

当我们对数据库执行读取和写入时,这很好。

但是我想知道如果我们实际上不对数据库进行任何读取或写入,这是有代价的吗?

如果为此使用 TransactionScope,则事务仅在第一次数据库访问时物理打开。未使用范围的成本非常低。

如果您使用普通的 EF 事务,那么空事务将访问数据库 3 次:

  1. 开始翻译
  2. 提交
  3. 为连接池重置连接

每一个都是极低的成本。您可以通过在循环中简单地 运行 这 100000 次来测试它的成本。很可能你并不在乎这点小成本。

我仍然反对这样做。根据我的经验,Web 应用程序需要比 Web 请求和事务的 1:1 对应更大的灵活性。此外,使用 HTTP 状态代码来决定交易的规则将变得不灵活。

此外,您必须为每个事务选择一个隔离级别(可能还有超时)。在 HTTP 请求开始时,不知道正确的值是什么。只有行动知道。

我在每个 HTTP 请求使用一个 EF 上下文然后在每个操作中手动使用事务方面有很好的经验。 LOC 方面的开销非常小。没有迫切需要集中这个。

不要盲目地把所有东西都放在 BEGIN...COMMIT 周围。在某些情况下,这只是错误

如果网页记录了用户的存在或特定页面的加载怎么办?拥有 ROLLBACK 会破坏该信息。

如果页面上有两个动作,而且彼此独立怎么办?那是 ROLLBACK 一个是可以的,但是你想 COMMIT 另一个?

如果页面上没有写入怎么办?那么就不需要BEGIN...COMMIT.