我正在使用 Hibernate在Jboss5上运行的 Web 应用程序中实现 DAO 层(Sybase DB)。
我面临的问题是当客户端/用户界面同时进行多个 HTTP 调用时——这反过来又调用 DAO 插入方法——存在竞争条件,导致两个调用几乎同时运行 DAO 插入方法。我真正想要的是
- 第一个请求调用 DAO 方法
- 第一个请求读取当前数据库值
- 根据当前 db 值检查新数据是否有效
- 如果有效,则插入新值
- 然后是第二个读取当前数据库值的请求
- 检查新数据是否有效
- 如果有效,则插入值...如果有更多调用,依此类推
我的 DAO 层代码如下所示:
@Override
@Transactional
public Set<PartyData> insertPartyData(final Set<PartyData> pData) throws DataServiceException
{
sessionFactory.getCurrentSession().getTransaction().begin();
//code to read the current db value
//validation code to check if new value can be inserted based on what's currently in db
sessionFactory.getCurrentSession().save(pData);
sessionFactory.getCurrentSession().getTransaction().commit();
}
问题?
如何确保数据库在一个事务期间锁定表,以便任何其他请求等到前一个事务完成?