搜尋

首頁  >  問答  >  主體

java - 在并发的情况下,程序事务和数据库事务是怎么运行的?

@Transactional
public void selectAndUpdate() {
    status = select ... for update;
    if(status!="初始值") {
        return;
    }
    
    //逻辑开始
    程序逻辑 ...
    举例:用户支付
    1.生成用户签名
    2.发起用户支付到第三方
    //逻辑结束
    
    update status语句...
}

如果利用这种方式来控制并发会有什么问题?另外我还想问大家的是:多个线程的话,会不会导致当一个线程执行到程序逻辑那块的时候,资源被另一个线程抢去的可能?导致另一个线程进入这个方法,发现状态还是没有被改变,然后又进入程序逻辑这块,导致两个线程都执行了一遍吗?数据库的一个事务没有完成的话,会让另外一个线程的事务进入吗?

高洛峰高洛峰2888 天前277

全部回覆(3)我來回復

  • 高洛峰

    高洛峰2017-04-18 09:19:48

    for update的缺点@Hisoka已经说了,for update除了会阻塞其它线程以外,加锁的过程对数据库的性能损耗也是很大的。
    所以推荐使用乐观锁来解决,因为程序逻辑这块都是在内存中操作不涉及原始的数据,所以只需要在update status語句...這裡使用樂觀鎖來控制狀態就行了

    回覆
    0
  • 迷茫

    迷茫2017-04-18 09:19:48

    這種方式是使用悲觀鎖來實現並發控制,瓶頸在於性能,另外就是for update 不帶上nowait會導致線程等待不會快速失敗,加了鎖之後就不會出現被其他線程搶去的情況了,另外事務有隔離等級和傳播行為的配置,不同設定有不同的結果,推薦找資料了解下先

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:19:48

    for update 是用來解決高並發場景的問題,採用了分散式鎖定的機制來實現的。第一條for update語句執行的手,後面的sql語句會sleep等待,直到第一個sql語句commit執行成功並提交後,才回去執行下一語句。

    回覆
    0
  • 取消回覆