有关同时使用同步和事务管理的问题

时间:2017-12-04 17:02:56

标签: java transactions

我正在进行代码审查,我发现了一个类似下面的代码片段,其中Java方法 processDataInTransaction 同时使用S ynchronized和Transaction Management 并调用< strong> createOrUpdateGroupData 方法

  private synchronized void processDataInTransaction(final Map<String, List<ListGroup>> groupMap,
            final GroupMetadata grpMetadata)
    {
        TransactionDefinition transactionDefinition = new DefaultTransactionAttribute(
                TransactionDefinition.PROPAGATION_REQUIRES_NEW);

        new TransactionTemplate(transactionManager, transactionDefinition)
                .execute(new TransactionCallbackWithoutResult()
                {
                    @Override
                    protected void doInTransactionWithoutResult(TransactionStatus status)
                    {
                        createOrUpdateGroupData(groupMap, grpMetadata);
                    }
                });
    }

    // createOrUpdateGroupData

        protected void createOrUpdateGroupData (Map<String, List<ListGroup>> map,
                                                GroupMetadata grpData) 
{  // Code omitted for clarity

}

现在我的问题是

  1. 我不能简单地将 @Transactional放在processDataInTransaction 删除已同步吗?
  2. createOrUpdateGroupData 上使用@Transactional(propagation = Propagation.MANDATORY)

1 个答案:

答案 0 :(得分:1)

答案取决于以下几点。

  • 同步确保方法processDataInTransaction将在多线程上下文中同步,如果您的方法没有执行,那么您可以删除同步。

  • 如果您想使用@Transactionnal,请告诉您通过AOP增强服务,如果是这种情况,那么您可以选择@Transactional。

最后,由于createOrUpdateGroupData是受保护的方法,因此代理模式可能不会生效;所以使用@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)来确保代理内部方法调用。