Maison >base de données >tutoriel mysql >Dans quelles circonstances mysql se bloquera-t-il ?
Deadlock
Cours recommandé : Tutoriel MySQL.
La clé de l'impasse est que l'ordre dans lequel deux (ou plus) sessions sont verrouillées est incohérent.
Ensuite, la clé correspondante pour résoudre le problème de blocage est : verrouiller différentes sessions dans l'ordre
Cas
Exigence : Investir l'argent Divisé en plusieurs tranches et distribués au hasard aux emprunteurs.
L'idée initiale du processus commercial est la suivante :
Une fois que l'investisseur a investi, le montant est divisé au hasard en plusieurs parties, puis quelques-unes sont sélectionné au hasard dans la liste des emprunteurs, utilisez ensuite select for update pour mettre à jour le solde dans la table des emprunteurs, etc.
Par exemple, si deux utilisateurs investissent en même temps, le montant de l'utilisateur A est divisé aléatoirement en 2 parties, et est distribué à l'emprunteur 1, 2
Le montant de l'utilisateur B est divisé aléatoirement en 2 parties Attribué à l'emprunteur 2, 1
L'ordre de verrouillage étant différent, une impasse apparaîtra bien sûr rapidement.
L'amélioration de ce problème est très simple, il suffit de verrouiller tous les emprunteurs attribués en même temps.
Sélectionnez * à partir de xxx où l'identifiant dans (xx,xx,xx) pour la mise à jour
La valeur de la liste dans MySQL sera automatiquement triée de petit à grand, ajoutez Le les serrures sont aussi une série de serrures de petite à grande
例如(以下会话id为主键): Session1: mysql> select * from t3 where id in (8,9) for update; +----+--------+------+---------------------+ | id | course | name | ctime | +----+--------+------+---------------------+ | 8 | WA | f | 2016-03-02 11:36:30 | | 9 | JX | f | 2016-03-01 11:36:30 | +----+--------+------+---------------------+ rows in set (0.04 sec) Session2: select * from t3 where id in (10,8,5) for update; 锁等待中…… 其实这个时候id=10这条记录没有被锁住的,但id=5的记录已经被锁住了,锁的等待在id=8的这里 不信请看 Session3: mysql> select * from t3 where id=5 for update; 锁等待中 Session4: mysql> select * from t3 where id=10 for update; +----+--------+------+---------------------+ | id | course | name | ctime | +----+--------+------+---------------------+ | 10 | JB | g | 2016-03-10 11:45:05 | +----+--------+------+---------------------+ row in set (0.00 sec) 在其它session中id=5是加不了锁的,但是id=10是可以加上锁的。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!