使用事务但实际上不进行任何查询是否会产生资源成本?
Does using a transaction but not actually making any queries have a resource cost?
好的,我们的一位团队成员建议,在每个 http 请求的开始,我们开始一个数据库事务(我们使用 Entity Framework 核心),完成请求的工作,然后完成如果响应为 200 Ok,则为事务处理,如果为其他响应,则回滚。
这意味着我们只会提交成功的请求。
当我们对数据库执行读取和写入时,这很好。
但是我想知道如果我们实际上不对数据库进行任何读取或写入,这是有代价的吗?
如果为此使用 TransactionScope
,则事务仅在第一次数据库访问时物理打开。未使用范围的成本非常低。
如果您使用普通的 EF 事务,那么空事务将访问数据库 3 次:
- 开始翻译
- 提交
- 为连接池重置连接
每一个都是极低的成本。您可以通过在循环中简单地 运行 这 100000 次来测试它的成本。很可能你并不在乎这点小成本。
我仍然反对这样做。根据我的经验,Web 应用程序需要比 Web 请求和事务的 1:1 对应更大的灵活性。此外,使用 HTTP 状态代码来决定交易的规则将变得不灵活。
此外,您必须为每个事务选择一个隔离级别(可能还有超时)。在 HTTP 请求开始时,不知道正确的值是什么。只有行动知道。
我在每个 HTTP 请求使用一个 EF 上下文然后在每个操作中手动使用事务方面有很好的经验。 LOC 方面的开销非常小。没有迫切需要集中这个。
不要盲目地把所有东西都放在 BEGIN...COMMIT
周围。在某些情况下,这只是错误。
如果网页记录了用户的存在或特定页面的加载怎么办?拥有 ROLLBACK
会破坏该信息。
如果页面上有两个动作,而且彼此独立怎么办?那是 ROLLBACK
一个是可以的,但是你想 COMMIT
另一个?
如果页面上没有写入怎么办?那么就不需要BEGIN...COMMIT
.
好的,我们的一位团队成员建议,在每个 http 请求的开始,我们开始一个数据库事务(我们使用 Entity Framework 核心),完成请求的工作,然后完成如果响应为 200 Ok,则为事务处理,如果为其他响应,则回滚。
这意味着我们只会提交成功的请求。
当我们对数据库执行读取和写入时,这很好。
但是我想知道如果我们实际上不对数据库进行任何读取或写入,这是有代价的吗?
如果为此使用 TransactionScope
,则事务仅在第一次数据库访问时物理打开。未使用范围的成本非常低。
如果您使用普通的 EF 事务,那么空事务将访问数据库 3 次:
- 开始翻译
- 提交
- 为连接池重置连接
每一个都是极低的成本。您可以通过在循环中简单地 运行 这 100000 次来测试它的成本。很可能你并不在乎这点小成本。
我仍然反对这样做。根据我的经验,Web 应用程序需要比 Web 请求和事务的 1:1 对应更大的灵活性。此外,使用 HTTP 状态代码来决定交易的规则将变得不灵活。
此外,您必须为每个事务选择一个隔离级别(可能还有超时)。在 HTTP 请求开始时,不知道正确的值是什么。只有行动知道。
我在每个 HTTP 请求使用一个 EF 上下文然后在每个操作中手动使用事务方面有很好的经验。 LOC 方面的开销非常小。没有迫切需要集中这个。
不要盲目地把所有东西都放在 BEGIN...COMMIT
周围。在某些情况下,这只是错误。
如果网页记录了用户的存在或特定页面的加载怎么办?拥有 ROLLBACK
会破坏该信息。
如果页面上有两个动作,而且彼此独立怎么办?那是 ROLLBACK
一个是可以的,但是你想 COMMIT
另一个?
如果页面上没有写入怎么办?那么就不需要BEGIN...COMMIT
.