1

我有以下情况。我有两张桌子。一个存储作为交易计数器的多个值。通过 java 应用程序,第一个表值被读取、递增并写入第二个表,以及新值被写回第一个表。显然,这可能会出错,因为它是一个多用户系统。在 Java 中,我对这个问题的解决方案是提供锁,在对任一表执行任何操作之前,必须,而且应该,获取锁。这些锁 ReentrantLocks 是静态的,表 1 中的每一列都有一个锁,因为它们的值完全相互独立。

这是推荐的方法吗?

干杯。

4

2 回答 2

5

。对数据库并发使用隐式数据库锁1。关系数据库支持作为ACID重要组成部分的事务:使用它们。

以 Java 为中心的锁不能跨 VM 工作,因此在多用户/服务器环境中无济于事。


1数据库足够智能,可以获取/释放锁以确保一致性和隔离性,甚至可以使用“无锁”实现,例如 MVCC。在极少数情况下必须请求显式数据库锁,但这是一个高级用例。

于 2012-10-08T22:55:24.017 回答
1

虽然同意@pst 回答的一些观点,但我会说这略有不同。

如果事件序列本质上是并且可能永远都是“面向 SQL”的,那么您也可以在数据库级别进行锁定(实际上,可能通过使用事务隐式地进行)。

但是,如果在您的应用程序层中存在或您计划构建重要的数据操作逻辑(通常或在此特定操作的情况下),则在应用程序级别锁定可能更合适。(实际上,您可能仍会在事务中运行 SQL,以便您实际上在两个级别上都锁定。)

对于依赖 DB 级锁定,我认为多个 VM 的问题本身并不一定是一个引人注目的问题。如果您有多个服务器应用程序访问数据库,则无论如何您都希望建立一个定义良好的协议,在什么情况下同时访问数据。在一个中等复杂度的系统中,无论如何您都希望建立一个对数据运行定期健全性检查的系统。(即使您的服务器应用程序在 100% 的时间里都表现完美,后端技术支持永远不必在您的应用程序之外的数据库上运行一些杂项 SQL...?)

于 2012-10-09T00:22:17.130 回答