java - 在并发的情况下,程序事务和数据库事务是怎么运行的?
高洛峰
高洛峰 2017-04-18 09:17:48
0
3
271
@Transactional
public void selectAndUpdate() {
    status = select ... for update;
    if(status!="初始值") {
        return;
    }
    
    //逻辑开始
    程序逻辑 ...
    举例:用户支付
    1.生成用户签名
    2.发起用户支付到第三方
    //逻辑结束
    
    update status语句...
}

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(3)
小葫芦

Kelemahan

for update @Hisoka telah pun mengatakan bahawa selain menyekat utas lain, proses penguncian juga menyebabkan kehilangan prestasi yang besar kepada pangkalan data. for update Oleh itu, adalah disyorkan untuk menggunakan penguncian optimistik untuk menyelesaikan masalah, kerana logik program dikendalikan dalam ingatan dan tidak melibatkan data asal, jadi anda hanya perlu menggunakan penguncian optimistik untuk mengawal keadaan dalam pernyataan
... di sini update status

迷茫

Kaedah ini menggunakan penguncian pesimis untuk mencapai kawalan konkurensi Kesesakan terletak pada prestasi Selain itu, untuk kemas kini tanpa menunggu akan menyebabkan utas menunggu dan gagal dengan cepat. Ini adalah kesnya. Di samping itu, urus niaga mempunyai tahap pengasingan dan konfigurasi tingkah laku penyebaran

Ty80

untuk kemas kini digunakan untuk menyelesaikan masalah senario konkurensi tinggi dan dilaksanakan menggunakan mekanisme kunci teragih. Apabila pernyataan pertama untuk kemas kini dilaksanakan, pernyataan sql berikutnya akan tidur dan menunggu sehingga komit pernyataan sql pertama berjaya dilaksanakan dan diserahkan sebelum kembali untuk melaksanakan pernyataan seterusnya.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan