跨db会话保持多用户状态

aemubtdh  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(334)

形势

假设我们有一个连接到(postgre)sql数据库的web应用程序,其任务可以概括为:
SELECT 可视化数据的操作。
UPDATE 基于可视化数据存储修改的操作。
很简单,但是。。。所涉及的数据不是特定于用户的,因此在处理过程中可能会被其他用户更改。编辑任务可能需要很长时间(可能超过一个小时),这意味着这些碰撞发生的概率并不低:实现一个健壮的问题解决方案是有意义的。

方法

想法是,一旦用户尝试提交更改(即启动 UPDATE 操作),将触发一些数据库检查,以确保所涉及的数据在此期间没有更改。
假设我们在数据上的每一个更改都加上了时间戳,那么就和在数据更新时保持访问时间一样简单 SELECT 并确保在这段时间之后,相关数据不会有新的变化。

问题

我们可以很容易地在用户执行编辑时将访问时间保留在前端应用程序中,然后在执行编辑时将其作为触发器函数的参数提供 UPDATE ,但出于安全原因,这是不可取的。数据库应该存储用户的访问时间。
直观的解决方案可以是 TEMPORARY TABLE 与数据库会话关联。但是,同样地,用户可能需要很长时间来完成任务,因此从池中捕获连接并将其空闲这么长时间似乎也不是一个好的选择。这个 SELECT 以及 UPDATE 操作将在不同的会话下执行。

问题

是否有任何范式或规范的方法来有效地解决这个问题?

4bbkushb

4bbkushb1#

这个问题被称为“丢失更新”问题。
有几种解决方案取决于是否使用连接池以及使用的事务隔离级别:
用select进行悲观锁定。。。用于不带连接池的更新
如果使用连接池,则使用timestamp列进行乐观锁定。

相关问题