4

我目前正在构建一个 Web 应用程序(中等现代),它可以对数据库进行一些简单的数据处理。我已经在考虑潜在的问题了。

假设用户登录到 Web 应用程序并从存储库加载一些数据。(S)他更改了数据,然后想将其写回数据库。

如何以标准化的方式预防以下情况:

  • (S)他登录了两次,并且已经在第二个会话中保存了一些数据,这些数据在第一个会话中保存时会丢失。
  • 其他一些用户加载了数据并正在更改它,他们可能会覆盖我们的更改。

我不想说 2 阶段提交,也不会推出我自己的版本。防止同一个用户登录两次(用户单例),再加上严格的权限管理可以解决第一个问题。但是如果业务需求允许多个代理查看和更改相同的数据,我仍然不知所措。

如果读取时的假设成立,是否有差异化库/算法可以测试要写入的数据?对于较大的商业应用程序,通常如何解决这个问题?

4

2 回答 2

3

我会在两种主要策略之间进行选择:

  • 乐观锁定
  • 悲观锁定

乐观锁定:您将版本(编号)与对象的 id 一起保存在存储库(数据库)中。在保存新对象之前,您检查要覆盖的旧对象的版本。如果版本与已编辑对象的版本不匹配,则中止保存并向用户报告存储库中的对象已更改。如果版本匹配,则用新对象覆盖旧对象并增加版本。

悲观锁定:在用户开始更改对象之前锁定对象。如果对象已被锁定,您将显示消息,即当前对象正在被另一个用户编辑。这可以在单个事务中使用 DB 锁定和说 Statefull bean 或使用单独的使用定义字段来完成。

悲观锁实现起来比较复杂,但它提供了更好的用户体验,因为如果出现乐观锁异常,它会阻止用户输入数据然后重新输入。

有关详细信息,请参阅http://docs.oracle.com/javaee/6/tutorial/doc/gkjhz.html

于 2013-07-08T08:11:52.643 回答
0

在大多数(我的意思是几乎所有)应用程序中,这是使用Oracle、MySQL、PostgreSQL 等 ACID 数据库完成的。

于 2013-07-08T08:07:08.670 回答