【问题标题】:EF multiple select queries in atomic transactionEF原子事务中的多选查询
【发布时间】:2018-05-08 07:17:31
【问题描述】:

虽然我对 EF 中的事务有疑问,但这里可能使用了错误的措辞。我偶然发现的大多数答案和问题都声称您应该让默认 EF 处理事务。

就我而言,我需要(至少)查询数据库三次以获取某些数据。 重要的是,这些数据来自相同的状态,它将使用 saveChanges 在不同的调用/线程中插入到一个事务中。

因此,由于它们是多个表,并且某些数据位于列表中,因此某些数据位于单个对象/行中,因此我需要多个 select 语句。

我的想法是在读取期间使用事务。我的期望是检索到的数据可能已经过时,尽管这很好;或者在事务期间插入会导致事务回滚。

我的问题,我的假设是否正确?其次,这是要走的路吗?

对于我们普通的简单查询,如果不同的线程尝试插入数据,它们将被踢出。所以这是乐观的阅读我相信。

有人可以在这里填写吗?

【问题讨论】:

  • 这取决于您的事务的事务隔离级别。虽然这种“在事务期间插入将导致事务回滚”永远不会发生(实际上没有什么可以回滚 - 你只读取,而不是修改数据)。
  • 只有在事务超时时才会抛出异常(例如,因为您的插入非常长并且您将要选择锁定数据)。无论如何-将您的选择包装在事务中并选择适当的隔离级别(我认为应该是可重复读取)。并尝试尽快完成事务,因为它会阻止您的插入(并且插入会阻止选择)。

标签: c# sql-server entity-framework


【解决方案1】:

您当然可以将 Transactions 与 EF 一起使用,尽管它不那么简单而且经常是不必要的。

您需要使用dbContext.Database.BeginTransaction() 方法来启动它。此方法采用IsolationLevel 参数,该参数确定锁定、脏读等。

有关隔离级别的更多信息,请参阅Microsoft Docs

【讨论】:

  • 是的 - 我对混沌隔离完全一无所知......在某些时候使用过大多数其他的
猜你喜欢
  • 2021-01-07
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多