需要使用Spring @Transactional和For Update

问题描述

假设两个用户同时更改同一订单的订单数量,则需要处理并发问题。我以为将行锁添加到称为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 (将#修改为@)