繁体   English   中英

使用交易但实际上没有进行任何查询会产生资源成本吗?

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

好的,我们的一个团队成员建议在每个http请求开始时我们开始一个数据库事务(我们使用实体框架核心),执行请求的工作,然后如果响应是200 Ok,则完成事务,或者如果是其他任何东西则回滚。

这意味着我们只承诺成功的请求。

当我们对DB执行读写操作时,这很好。

但是我想知道如果我们实际上没有对数据库进行任何读取或写入,这是否需要付出代价?

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

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

  1. 开始了
  2. 承诺
  3. 重置连接池的连接

这些都是极低的成本。 您只需在循环中运行此100000次即可测试此成本。 很可能你不关心这个小成本。

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

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

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

不要盲目地把BEGIN...COMMIT一切。 有些情况下这是错误的

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

如果页面上有两个操作,并且它们彼此独立,该怎么办? 这是一个ROLLBACK是好的,但你想COMMIT其他?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM