mysql高さと発表ロック、行ロック
1093 ワード
栗を挙げると、ユーザーがチャージするときに財布の総額を変更したり、チャージ記録を追加したりします.
ぶんせき
ソリューション:1.時計に鍵をかける?行錠?2.表ロック分readロックおよびwriteロックreadロックが入った分析はまだ役に立たない.表全体に書き込みロックを加えるしかないが、効率が大幅に低下する
3.行ロック共有ロックおよび排他ロック(インデックスレベル、上端sqlを例にuser_idはインデックスである必要があります.そうでないと、テーブルロックとしてロックされます)は、次のように統合されます.
ぶんせき
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;