【发布时间】:2011-02-28 14:27:32
【问题描述】:
当前情况:我有一个服务有几个典型的服务方法,如 create()、remove()、findXy()、.. 等。现在我想防止两个不同的服务调用同时,这意味着我想在第一次输入后锁定我的服务调用,因此第二个客户端(或再次相同的客户端)只会在第一个客户端完成后立即进入该方法。
出于锁定目的,我们通常使用 ReentrantLocks。他们工作得很好。但是现在我怀疑如何实现这些 ReentrantLocks,因为我不想在每一个方法中都插入它们。此外,我们的服务层已经自行定义了它们的事务上下文,这意味着,当我将它们集成到方法本身时,事务在锁定发生之前就已经开始了。
public class WorkerServiceServerImpl implements WorkerServiceRemote
{
private static final ReentrantLock workerLock = new ReentrantLock( true );
@Autowired
private WorkerDao workerDao;
@Override
@Transactional
public int createWorker( int projectId ) throws RemoteException
{
workerLock.lock();//NO GOOD! Transaction already started!
try
{
workerDao.create( projectId );
//Do some more stuff...
}
finally
{
workerLock.unlock();//Unlock, next request can be handled!
}
}
...
}
当然我可以在这个 WorkerServiceImpl 类之上创建一个 ServiceLayer 并将调用转发到原始服务,但是由于我有 30 个服务,我想知道是否有任何全局解决方案来解决这个问题。或者是否可以创建一个在事务开始之前触发的自己的注释?
欢迎任何想法,在此先感谢! 梅内
编辑:为简单起见,我选择 CRUD 方法。当然,这些服务调用要高级得多,可以在一次调用中调用不同的 CRUD 方法。
【问题讨论】:
标签: java spring transactions service locking