使用Java锁实现数据库并发



我有以下场景。我有两张桌子。一个存储多个值,这些值是事务的计数器。通过java应用程序,第一个表值被读取、递增并写入第二个表,新值也被写回第一个表。显然,由于这是一个多用户系统,因此有可能出错。我在Java中对这个问题的解决方案是提供锁,在对任何一个表采取任何操作之前,必须获取这些锁,应该。这些锁ReentrantLock是静态的,表1中的每列都有一个锁,因为这些值彼此完全独立。

这是推荐的方法吗?

干杯。

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

以Java为中心的锁将无法跨VM运行,因此在多用户/服务器环境中也没有帮助


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

虽然同意@pst的一些观点,但我认为这略有不同。

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

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

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