我正在进行代码审查,我发现了一个类似下面的代码片段,其中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
}
现在我的问题是
答案 0 :(得分:1)
答案取决于以下几点。
同步确保方法processDataInTransaction将在多线程上下文中同步,如果您的方法没有执行,那么您可以删除同步。
如果您想使用@Transactionnal,请告诉您通过AOP增强服务,如果是这种情况,那么您可以选择@Transactional。
最后,由于createOrUpdateGroupData是受保护的方法,因此代理模式可能不会生效;所以使用@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)来确保代理内部方法调用。