1

也许这个问题不是很清楚,但我没有找到更好的标题,它描述了我想很快处理的问题。

我想限制从 java 桌面应用程序对 postgres 的访问。

的背景:

假设您有 2 个应用程序正在运行,第一个应用程序必须根据数据库中的数据进行一些复杂的计算。为了确定数据库中数据的不变性,我想锁定数据库以进行插入、更新和删除操作。在客户端,我认为不可能令人满意地处理这种行为。所以我想在服务器端使用一个像代理一样工作的小 java-app。所以任务是交出CRUD(创建读更新删除)操作,直到它得到一个锁定命令。在锁定之后,它会拒绝所有 CUD 操作,直到它从锁定客户端获得解锁命令或达到超时。

问题:

您如何看待这种方法?

使用这种方法时是否可以锁定数据库?

您更喜欢 Java SE 还是 Java EE 作为服务器端 Java 应用程序?

提前致谢。

4

3 回答 3

3

为什么不在您的操作中使用事务?数据库本身具有维护数据完整性的功能,而不是求助于诸如数据库总锁定之类的粗暴操作。

您描述的这种锁定机制听起来对用户来说是一种痛苦。是用户启动锁定还是软件本身?如果是用户,当 Bob 锁定然后去吃午饭 2 小时,忘记先解锁数据库时,您可能会遇到一些问题......

于 2008-10-23T16:50:47.110 回答
1

确实......有一些适当的方法可以解决这个问题。

  1. 只需锁定代码中的表格。Postgresql 具有用于锁定整个表的命令,您可以从客户端应用程序运行这些命令
  2. 选择一个事务隔离级别,该级别不存在读取 txn 启动后提交的数据的问题(BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ)。

其中,到目前为止,最有效的是使用可重复读取作为隔离级别。Postgres 非常有效地支持这一点,它将为您提供一致的数据视图,而无需对数据库进行如此重的锁定。

于 2008-10-23T19:26:58.713 回答
0

那一年我考虑过交易,但在这种情况下我不能使用它们。对不起,我没有准确地提到它。所以假设以下简单的情况:计算关闭了一个责任范围。在 calc 之后打开一个新的,并专门为它插入新的插入。但是,在计算过程中,不允许对(当前计算的)责任区域的数据进行插入、更新或删除。由于必须存档数据,因此严格禁止删除更多内容。

所以imo使用事务不符合这个要求。还是我错过了什么?

ps:(题外话)@jsight:我目前读到,postgres 将“可重复读取”映射到“可序列化”,因此使用“可重复读取”会给您带来比您可能期望的更多限制。

于 2008-10-24T08:59:57.730 回答