mysql高さと発表ロック、行ロック

1093 ワード

栗を挙げると、ユーザーがチャージするときに財布の総額を変更したり、チャージ記録を追加したりします.
ぶんせき
start TRANSACTION
update user_balance set user_money=_user_money where user_id=_user_id;
insert into user_balancelog (user_id,user_money) values(_user_id,_user_money);
**#         ,                             select sleep(5);  **
commit;

ソリューション:1.時計に鍵をかける?行錠?2.表ロック分readロックおよびwriteロックreadロックが入った分析はまだ役に立たない.表全体に書き込みロックを加えるしかないが、効率が大幅に低下する
3.行ロック共有ロックおよび排他ロック(インデックスレベル、上端sqlを例にuser_idはインデックスである必要があります.そうでないと、テーブルロックとしてロックされます)は、次のように統合されます.
declare _money DECIMAL(10,2) DEFAULT 0; #    
declare error bit DEFAULT false;
declare CONTINUE HANDLER for SQLEXCEPTION set error=true; #      
select user_money into _money from user_balance where user_id=_user_id for update;
set _user_moneys=_user_money+_money;
start TRANSACTION;
update user_balance set user_money=_user_moneys where user_id=_user_id;
insert into user_balancelog (user_id,user_money) values(_user_id,_user_money);
if error=true THEN
ROLLBACK; select ‘  ’ as result;
ELSE
commit;
select ‘    ’ as result;
end if;