我有以下情况。 我有两张桌子。一个存储多个值,这些值是事务的计数器。通过java应用程序,读取第一个表值,递增并写入第二个表,以及将新值写回第一个表。显然,这可能会出错,因为它是一个多用户系统。 我在Java中解决这个问题的解决方案是在任何一个表上执行任何操作之前提供必须应该的锁。这些Locks,ReentrantLocks是静态的,表1中的每列都有一个,因为这些值完全相互独立。
这是推荐接近吗?
干杯。
答案 0 :(得分:5)
否。使用隐式数据库锁 1 进行数据库并发。关系数据库支持作为ACID的重要部分的事务:使用它们。
以Java为中心的锁将无法跨虚拟工作,因此在多用户/服务器环境中无法帮助。
1 数据库非常智能,可以获取/释放锁以确保一致性和隔离,甚至可以使用“无锁”实现,例如MVCC。当必须请求显式数据库锁时,有罕见的时机,但这是一个高级用例。
答案 1 :(得分:1)
虽然同意@pst答案的一些观点,但我会说这有点依赖。
如果事件序列是,并且可能永远是“面向SQL”,那么您也可以在数据库级别进行锁定(实际上,可能通过使用事务隐式)。
但是,如果有,或者您计划在应用层内构建重要的数据操作逻辑(通常或在此特定操作的情况下),则锁定在应用级别可能更合适。 (实际上,您可能仍会在事务中运行SQL,以便实际锁定两个级别。)
我认为多个虚拟机的问题本身并不一定是依赖于数据库级别锁定的一个引人注目的问题。如果您有多个服务器应用程序访问数据库,您无论如何都希望建立一个明确定义的协议,在什么情况下同时访问哪些数据。在一个中等复杂度的系统中,您无论如何都希望构建一个对数据进行定期健全性检查的系统。 (即使您的服务器应用程序在100%的时间内表现得非常好,但是后端技术支持永远不会在您的应用程序之外的数据库上运行一些杂项SQL ...?)