问题描述
假设两个用户同时更改同一订单的订单数量,则需要处理并发问题。我以为将行锁添加到称为proc_lock的特定表中,该表将包含proc_key = order_id。由于用户正在修改相同的订单,因此他们的order_id是相同的。 这个想法是第一个用户将这个条目锁定在proc_lock表中,以便第二个用户试图锁定相同的记录时,他将无法获得锁定,因此无法更新订单。
我正在使用spring @Transactional创建事务,下面是代码:
backingBean.java
@Transactional(propagation = Propagation.REQUIRES_NEW)
public synchronized String validateItemQtyAction()
{
....
lockStatus = ((COBLIReceivingManagerService) service).processLock( procLockKey,procType);
//Check in db for row level locks. Once the call comes back here you will not find row lock.
if(lockStatus){
....
}
}
ServiceClass.Java
@Transactional(propagation = Propagation.required)
public boolean processLock(String procKey,String procType)
{
boolean lockStatus = false;
try
{
lockStatus = ((COBLReceivingManagerDAO) dao).acquireLock(procKey,false);
}
catch(Exception ex)
{
WMDebugLog.DEBUG_LOG.logException(WMDebugLog.WM_COMMON_CATEGORY,ex);
return false;
}
//Check the db for row level lock. At this point the lock in db exist
return false;
}
DaoImpl.java
public int acquireLock(String procKey,boolean withTimeOut)
{
JdbcTemplate jdbcTemplate = (JdbcTemplate) ILSApplicationContext.getBean("jdbcTemplate");
StringBuilder selectForUpdatesql = new StringBuilder("SELECT 1 FROM PROC_LOCK WHERE PROC_KEY = ? FOR UPDATE ");
List<Integer> valueReturned = jdbcTemplate.query(selectForUpdatesql.toString(),procKeyArray,intMapper);
//Check the db for row level lock. At this point the lock in db exist
if (!Misc.isNullList(valueReturned) && valueReturned.get(0) == 1)
return true;
else
return false;
}
流来自backingBean ServiceClass DaoImpl 当调用从DaoImpl返回到serviceimpl并在serviceImpl中时,我可以看到db中的锁定。但是当调用从ServiceClass返回backingBean时,db中的锁不再保留。
在backingBean方法调用完成之前,我需要锁存在数据库中。
您能告诉我们这里遗漏了什么吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)