@Transactional
public void selectAndUpdate() {
status = select ... for update;
if(status!="初始值") {
return;
}
//逻辑开始
程序逻辑 ...
举例:用户支付
1.生成用户签名
2.发起用户支付到第三方
//逻辑结束
update status语句...
}
如果利用这种方式来控制并发会有什么问题?另外我还想问大家的是:多个线程的话,会不会导致当一个线程执行到程序逻辑那块的时候,资源被另一个线程抢去的可能?导致另一个线程进入这个方法,发现状态还是没有被改变,然后又进入程序逻辑这块,导致两个线程都执行了一遍吗?数据库的一个事务没有完成的话,会让另外一个线程的事务进入吗?
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
.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.