数据库并发 - 处理不同步对象

时间:2013-09-12 06:45:38

标签: database concurrency

我正在使用DAL服务来检索数据库中的数据。

让我们观察一下从数据库中检索一个对象的最简单的情况。

在检索该对象后,我根据一些业务逻辑对其属性进行了一些更改, 而且我想要更新持久数据库中的对象。

然而,其他一些客户端(甚至可能是我不知道存在的客户端)改变了数据库中下划线对象的状态,并且在我尝试更新时我发现了这一点。

在这种情况下我该怎么做?

我应该抛出异常吗?

我是否应该尝试仅更新我更改的字段?

当我根据持久数据执行业务逻辑时,是否应该锁定该表以进行写入?

2 个答案:

答案 0 :(得分:3)

我认为你应该做的事情取决于你想要达到的目标。 我看到你的主要选择:

  • 预先锁定 - 主要优点&缺点 - 占用数据库直到你提交,更简单。

  • 请勿事先锁定,合并以防其他人更新 - 主要劣势 - 合并可能非常复杂

我会选择第一个,但我会尝试最小化锁定时间(即我想知道在锁定对象之前我想要做的所有更改 /强>)。

任何方式我都不认为这是一个特例。所以我不会抛出异常。

答案 1 :(得分:0)

这是非常主观的,这取决于你究竟想要的是什么。

  

我应该抛出异常吗?

  • 如果您不想要其他用户更新,则应该这样做。例如,您的软件正在尝试预订已经由某人预订的座位,您将抛出SeatAlreadyBookedException并通过记录或显示正确的消息来适当处理
  

我是否应该尝试仅更新我更改的字段?

  • 如果您尚未使用现有状态进行更新,或者您希望更改是覆盖其他用户已完成的任何更改的最终更改,则可以执行此操作。例如,如果要更新项目截止日期的新日期。
  

在我执行商务时,是否应该锁定该表以进行写入   基于持久数据的逻辑?

  • 锁定表格会影响整体吞吐量。您的应用程序逻辑应该采用这些事务并保证数据的完整性。