【问题标题】:DB transaction or Java DAO's method synchronization?DB事务还是Java DAO的方法同步?
【发布时间】:2017-04-14 22:52:39
【问题描述】:

我有基于 Java 的 web 服务器,也有带有方法的 DAO 单例对象,其 SQL 操作的逻辑必须以某种方式同步以保证数据 完整性(可以同时从多个 Java 线程访问方法)。

我想知道DB事务包装(可序列化级别)是否比服务器端的DAO方法显式同步更好?

【问题讨论】:

    标签: java database multithreading transactions synchronization


    【解决方案1】:

    是的,使用事务更好。在您的代码中同步、锁定类时,该锁定的范围是您的类加载器,并且在您的应用程序的第二个实例上运行将使您的锁定无效,因为这两个实例使用不同的锁定。

    使用数据库事务,您可以拥有应用程序的多个实例,并且数据库对所有事务一视同仁。

    对于数据库,您还可以选择将隔离级别降低到不高于该事务所需的级别,或者使用行级锁定。这些更难在代码中实现,而且您仍然无法部署第二个实例。

    【讨论】:

      【解决方案2】:

      很大程度上取决于你想要同步什么,同步是关于资源的,如果你的代码中有多个数据库,并且数据完整性问题是分布式的,你需要一个事务上下文,不仅要声明它,还要知道如何正确管理它。 假设您有一个单一的数据库,并假设您的问题是由于 SELECT 子句可能与方法中稍后发生的 UPDATE 或 INSERT 子句不一致而导致的完整性,正确的解决方案是数据库事务和使用 SELECT FOR UPDATE 子句. 如果您的问题是关于在同一操作中更新/插入不同表的问题,您可能有两种资源,一种是包括 CONSTRAINTS,这是首选方法,但在某些情况下是不可能的。 如果无法使用 CONTRAINT,请考虑重新设计您的 DATAMODEL,因为管理此类问题同步应用程序代码是最糟糕的解决方案,但即便如此也是一种解决方案。

      【讨论】:

        猜你喜欢
        • 2011-03-31
        • 2011-03-04
        • 1970-01-01
        • 2018-01-27
        • 2015-06-08
        • 2015-06-13
        • 2012-09-22
        • 2019-07-31
        • 2016-06-17
        相关资源
        最近更新 更多