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

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

高洛峰
高洛峰

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

répondre à tous(3)
小葫芦

Inconvénients de

for update @Hisoka a déjà déclaré qu'en plus de bloquer d'autres threads, le processus de verrouillage entraîne également une énorme perte de performances pour la base de données. for update Par conséquent, il est recommandé d'utiliser le verrouillage optimiste pour résoudre le problème, car la logique du programme fonctionne en mémoire et n'implique pas de données d'origine, vous n'avez donc besoin d'utiliser le verrouillage optimiste que pour contrôler l'état dans l'instruction
... ici update status

迷茫

Cette méthode utilise un verrouillage pessimiste pour obtenir un contrôle de concurrence. De plus, une mise à jour sans nowait entraînera une attente et un échec rapide du thread. Après l'ajout du verrou, il ne sera pas récupéré par d'autres threads. C'est le cas. De plus, les transactions ont des configurations de niveau d'isolement et de comportement de propagation. Il est recommandé de rechercher des informations pour en savoir plus

.
Ty80

for update est utilisé pour résoudre le problème des scénarios de concurrence élevée et est implémenté à l'aide d'un mécanisme de verrouillage distribué. Lorsque la première instruction for update est exécutée, les instructions SQL suivantes resteront en veille et attendront que la première validation de l'instruction SQL soit exécutée et soumise avec succès avant de revenir pour exécuter l'instruction suivante.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal