【发布时间】:2017-04-14 22:52:39
【问题描述】:
我有基于 Java 的 web 服务器,也有带有方法的 DAO 单例对象,其 SQL 操作的逻辑必须以某种方式同步以保证数据 完整性(可以同时从多个 Java 线程访问方法)。
我想知道DB事务包装(可序列化级别)是否比服务器端的DAO方法显式同步更好?
【问题讨论】:
标签: java database multithreading transactions synchronization
我有基于 Java 的 web 服务器,也有带有方法的 DAO 单例对象,其 SQL 操作的逻辑必须以某种方式同步以保证数据 完整性(可以同时从多个 Java 线程访问方法)。
我想知道DB事务包装(可序列化级别)是否比服务器端的DAO方法显式同步更好?
【问题讨论】:
标签: java database multithreading transactions synchronization
是的,使用事务更好。在您的代码中同步、锁定类时,该锁定的范围是您的类加载器,并且在您的应用程序的第二个实例上运行将使您的锁定无效,因为这两个实例使用不同的锁定。
使用数据库事务,您可以拥有应用程序的多个实例,并且数据库对所有事务一视同仁。
对于数据库,您还可以选择将隔离级别降低到不高于该事务所需的级别,或者使用行级锁定。这些更难在代码中实现,而且您仍然无法部署第二个实例。
【讨论】:
很大程度上取决于你想要同步什么,同步是关于资源的,如果你的代码中有多个数据库,并且数据完整性问题是分布式的,你需要一个事务上下文,不仅要声明它,还要知道如何正确管理它。 假设您有一个单一的数据库,并假设您的问题是由于 SELECT 子句可能与方法中稍后发生的 UPDATE 或 INSERT 子句不一致而导致的完整性,正确的解决方案是数据库事务和使用 SELECT FOR UPDATE 子句. 如果您的问题是关于在同一操作中更新/插入不同表的问题,您可能有两种资源,一种是包括 CONSTRAINTS,这是首选方法,但在某些情况下是不可能的。 如果无法使用 CONTRAINT,请考虑重新设计您的 DATAMODEL,因为管理此类问题同步应用程序代码是最糟糕的解决方案,但即便如此也是一种解决方案。
【讨论】: