1

我有一个 MySql 数据库实例,其中包含一个维护Balance字段的Account表。我有多个 Java 应用程序,每个应用程序都使用 Jdbc 连接到数据库,这可能会增加或减少Balance字段的值。如何确保读取、计算和更新Balance值,并且该过程是独立发生的,并且“了解”可能正在执行相同操作的任何其他 Java 进程?

4

3 回答 3

5

简单的答案是使用事务: http ://dev.mysql.com/doc/refman/5.0/en/commit.html

但是,在您描述的情况下,我更喜欢不将帐户余额存储为表中的列,而是通过对与该帐户相关的交易的价值求和来计算它。它对您提出的完整性问题的敏感性要低得多,并且您不太可能遇到晦涩的锁定场景。

于 2011-09-21T08:25:38.257 回答
2

一种简单的方法是 JDBC 事务管理。请参阅java.sql.Connection.setAutoCommit()文档。它使您能够显式禁用自动语句提交:

Connection c = /* retrieve connection */
c.setAutoCommit(false);
c.setTransactionIsolation(/* depends on your requirements */);
c.executeQuery(/*  */);
c.executeUpdate(/*  */);
c.commit(); /* or c.rollback() */

在现实世界的场景中,您必须引入一个finally块来提交或回滚事务,否则您最终可能会在数据库中出现死锁。

编辑:如果您的 Java 应用程序是最终用户客户端,那么您总是面临用户绕过您的事务管理逻辑直接连接到数据库(例如使用 Access)的风险。这就是我们开始在两者之间放置应用服务器的原因之一。一个解决方案也可能是实现一个存储过程,以便客户端根本不与表交互。

于 2011-09-21T08:21:58.000 回答
1

如果您使用的是 InnoDB 引擎,那么您可以使用MySQL 记录级别锁定来锁定特定帐户记录以进行其他客户端的更新。

更新:或者,您可以在此处描述应用程序级锁。

于 2011-09-21T08:28:15.993 回答