我有基于Java的Web服务器,我也有方法的DAO单例对象,其SQL操作的逻辑必须以某种方式同步以保证数据 完整性(方法可以同时从多个Java线程访问)。
我想知道服务器端的DB事务包装(可序列化级别)是否优于DAO的方法显式同步?
答案 0 :(得分:1)
是的,使用交易更好。通过在代码中进行同步,锁定类,该锁的范围是您的类加载器,并且站起来应用程序的第二个实例将使锁定无效,因为这两个实例使用不同的锁。
使用数据库事务,您可以拥有应用程序的多个实例,并且数据库会将所有事务视为相同。
对于数据库,您可以选择将隔离级别调低到不高于该事务所需的级别,或者使用行级锁定。这些在代码中更难实现,而你仍然无法部署第二个实例。
答案 1 :(得分:1)
在很大程度上取决于您想要同步的内容,同步是关于资源的,如果您的代码中有多个数据库,并且数据完整性问题是分布式的,那么您需要一个事务上下文,不仅要声明它,还要知道如何正确管理它。 假设您有一个数据库并假设您的问题是由SELECT子句与方法中稍后发生的UPDATE或INSERT子句的可能不一致导致的完整性,正确的解决方案将是DB事务并使用SELECT FOR UPDATE子句。 如果您的问题是关于同一操作中不同表的UPDATE / INSERT,则可能有两个资源,一个是包含CONSTRAINTS,这是首选方法,但在某些情况下是不可能的。 如果无法使用CONTRAINT,请考虑重新设计DATAMODEL,因为管理此类问题同步应用程序代码是最糟糕的解决方案,但即便如此也是一种解决方案。