[英]Does using a transaction but not actually making any queries have a resource cost?
好的,我们的一个团队成员建议在每个http请求开始时我们开始一个数据库事务(我们使用实体框架核心),执行请求的工作,然后如果响应是200 Ok,则完成事务,或者如果是其他任何东西则回滚。
这意味着我们只承诺成功的请求。
当我们对DB执行读写操作时,这很好。
但是我想知道如果我们实际上没有对数据库进行任何读取或写入,这是否需要付出代价?
如果您使用TransactionScope
,则只在第一次数据库访问时物理打开事务。 未使用范围的成本非常低。
如果使用普通的EF事务,那么空事务将三次访问数据库:
这些都是极低的成本。 您只需在循环中运行此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.