ÊÂÎñ¡¢ÊÂÎñ²¢·¢(ËÄ)
2015-01-21 11:11:54
¡¤
×÷Õß:
¡¤
ä¯ÀÀ: 30
8L2VtPjwvdT66zTx1PjxlbT48c3Ryb25nPriyuMe4/NDCPC9zdHJvbmc+PC9lbT48L3U+u+G3osn6o6yyorei0NTE3LrDoaO087K/t9bK/b7dv+K1xMSsyM+49MDrvLax8KOssqK3otDUxNy9z7rDoaM8YnI+Cjx1PjxlbT48c3Ryb25nPlJlcGVhdGFibGUgUmVhZL/J1ti4tLbBPC9zdHJvbmc+PC9lbT48L3U+o7rE3LHcw+I8dT48ZW0+PHN0cm9uZz7U4LbBPC9zdHJvbmc+PC9lbT48L3U+us08dT48ZW0+PHN0cm9uZz6yu7/J1ti4tLbBPC9zdHJvbmc+PC9lbT48L3U+o6y1qzx1PjxlbT48c3Ryb25nPrvDtsE8L3N0cm9uZz48L2VtPjwvdT674beiyfqjrLKit6LQ1MTcu+HK3NOwz+yho9bB09o8dT48ZW0+PHN0cm9uZz64srjHuPzQwjwvc3Ryb25nPjwvZW0+PC91PqOs1PLK08r9vt2/4rb4wtuhozxicj4KPHU+PGVtPjxzdHJvbmc+U2VyaWFsaXphYmxl0PLB0LuvPC9zdHJvbmc+PC9lbT48L3U+o7rE3LHcw+I8dT48ZW0+PHN0cm9uZz7U4LbBPC9zdHJvbmc+PC9lbT48L3U+oaI8dT48ZW0+PHN0cm9uZz6yu7/J1ti4tLbBPC9zdHJvbmc+PC9lbT48L3U+us08dT48ZW0+PHN0cm9uZz67w7bBPC9zdHJvbmc+PC9lbT48L3U+o6yyorei0NTE3LLuoaPWwdPaPHU+PGVtPjxzdHJvbmc+uLK4x7j80MI8L3N0cm9uZz48L2VtPjwvdT6jrNTyytPK/b7dv+K2+MLboaMKPGJyPgrV4tH5v7TAtKOsysLO8bj0wOu8trHwusPP8dPrt+LL+NCt0unKx9K70ru21NOmtcSho7bBzrTM4b270+vSu7y2t+LL+NCt0um21NOmoaK2wdLRzOG9u9Prtv68trfiy/jQrdLpttTTpqGiv8nW2Li0tsHT68j9vLa34sv40K3S6bbU06aho7Wrvq25/bG+yMu1xNHp1qSjrNXiuPayu83qyKvV/ci3o6y49MDrvLax8MrH0ru49rnmt7ajrLb4t+LS6dCt0unKx7nmt7a1xNK71tbKtc/Wt73KvaGjscjI5215c3HNrMqxyrnTw8r9vt3Q0LDmsb7T68v4tcS7+tbGwLTKtc/WuPTA67y2sfC1xKOsREIytaW0v8q508PL+LXEu/rWxsC0yrXP1rj0wOu8trHwoaPO0rvh1tjQwtX7wO3Su8aqzsTVwr2yvbK52NPabXlzcWzT60RCMtTauPTA67y2sfC3vcPmtcTPuL3a0+vH+LHwoaM8YnI+Cjxicj4KztLDx9LRvq3WqrXAwcvP4LnYtcTWqsq2sbO+sKOs1NnAtL+0v7TO0sPHz7XNs7XEzsrM4qGjPGJyPgrPtc2zyrnTw7XEysdEQjKjrMv509DWu7bBysLO8cq508NVUrj0wOu8trHwo6jP4LnY09q2wc60zOG9u6Opo6zG5Mv7ysLO8cq508NSU7j0wOu8trHwo6jP4LnY09q/ydbYuLS2waOpoaO74dSxtcTXyrL6uabE3LzytaW9stPQ1Pa807rNv9u89bLZ1/ehozxicj4K1Pa807LZ1/c8YnI+CjxwcmUgY2xhc3M9"brush:sql;">start transaction //µÚÒ»²½£¬²éѯÕË»§¿ÉÓÃÓà¶î select ... from account where account_id = ... //µÚ¶þ²½£¬ÓàÁ¿¼ÓÉÏÔö¼ÓÁ¿£¬²¢¸³Öµ¸øÐ±äÁ¿newBalance set newBalance = dbBalance + changeAmount //µÚÈý²½£¬¸üлáÔ±ÕË»§¼Ç¼ update account set balance = newBalance where account_id = ... //µÚËIJ½£¬ÆäËü²Ù×÷ commit
¿Û¼õ²Ù×÷
start transaction
//µÚÒ»²½£¬²éѯÕË»§¿ÉÓÃÓà¶î
select ... from account where account_id = ...
//µÚ¶þ²½£¬ÓàÁ¿¿ÛÈ¥Ôö¼ÓÁ¿£¬²¢¸³Öµ¸øÐ±äÁ¿NEW_BALANCE£¬Èç¹ûÓàÁ¿²»×ãÔò±¨´í¡£
set newBalance = dbBalance - changeAmount
if ( newBalance < 0 ) throw new Exception("...");
//µÚÈý²½£¬¸üлáÔ±ÕË»§¼Ç¼
update account set balance = newBalance where account_id = ...
//µÚËIJ½£¬ÆäËü²Ù×÷
commit
ÉÏÃæÊ¹ÓÃαÓïÑÔÃèÊö£¬¿ÉÒÔ¿´³ö£¬²»ÂÛÊÇÔö¼Ó»¹Êǿۼõ²Ù×÷£¬¶¼ÊÇÏȲéѯ³öÕË»§¼Ç¼£¬¸ù¾Ý¼Ç¼ֵ×÷¼ÆË㣬×îºóÔÙ¸üмǼ¡£µ±ÍâΧ
ϵͳͬʱ·ÃÎÊͬһ»áÔ±×ö¿Û¼õµÄʱºò£¬ËÀËø¾ÍÓпÉÄÜ·¢ÉúÁË£¬±ÈÈ磺
ÊÂÎñT1Ö´ÐеÚÒ»²½£¬²éѯÁË»áÔ±µÄÕË»§¼Ç¼£¬ÒòΪ¸ôÀë¼¶±ðÊÇRS£¬ËùÒÔ»á¶Ô»áÔ±ÕË»§¼Ç¼¼ÓSËø£»ÕâʱºòÊÂÎñT2Ò²Ö´ÐÐÁ˵ÚÒ»²½£¬Ò²¶Ô»áÔ±µÄÕË»§¼Ç¼¼ÓÁËSËø£»Ö®ºóÊÂÎñT1Ö´ÐеÚÈý²½£¬ÔÚ×¼±¸¸üлáÔ±ÕË»§¼Ç¼ǰÐèÒªÏÈ¶ÔÆä¼ÓXËø£¬µ«·¢ÏּǼÒѾ±»ÆäËüÊÂÎñ£¨ÊÂÎñT2£©¼ÓÁËSËø£¬ËùÒÔÊÂÎñT1¹ÒÆð£¬µÈ´ýÊÂÎñT2ÊÍ·ÅÕË»§¼Ç¼µÄSËø£»½Ó×ÅÊÂÎñT2Ò²Ö´Ðе½µÚÈý²½£¬ÔÚ×¼±¸¸üлáÔ±ÕË»§¼Ç¼ǰÐèÒªÏÈ¶ÔÆä¼ÓXËø£¬µ«·¢ÏּǼÒѾ±»ÆäËüÊÂÎñ£¨ÊÂÎñT1£©¼ÓÁËSËø£¬ËùÒÔÊÂÎñT2Ò²¹ÒÆðµÈ´ýÊÂÎñT1¡£ÕâÑùËÀËø¾Í·¢ÉúÁË¡£
ÖªµÀÁËËÀËø·¢ÉúµÄÔÒò£¬ÄÇÏÖÔÚ¿´¿´ÈçºÎ½â¾öÕâ¸öÎÊÌâ¡£ËÀËø·¢ÉúµÄÔÒòÖ÷ÒªÊǵÚÒ»²½²éѯµÄʱºò¶ÔÕË»§¼Ç¼¼ÓÁËSËø£¬ËùÒÔÈçºÎÎÒÃǰѸôÀë¼¶±ð½µÎªCS£¨Ï൱ÓÚ¶ÁÒÑÌá½»£©£¬ÄÜ·ñ½â¾öÎÊÌâÄØ£¿´ð°¸ÊÇ·ñ£¬°Ñ¸ôÀë¼¶µ×½µÎªCSȷʵ¿ÉÒÔ±ÜÃâËÀËøµÄ·¢Éú£¬ÒòΪ²éѯ²Ù×÷½áÊøºó¾Í»áÊÍ·ÅSËø£¬µ«ÊÇÈ´»á·¢Éú
¸²¸Ç¸üеÄÎÊÌ⣬ËùÒÔÕâ¸ö·½°¸²»¿ÉÐС£¼ÈÈ»ÎÊÌâ³öÔÚµÚÒ»²½£¬ÄǾÍÊǵÚÒ»²½³ö·¨¿´¿´°É£¬Èç¹û²éѯÕË»§µÄʱºò£¬ÎÒÃÇÏÔʾµÄ¶Ô¼Ç¼¼ÓXËø¶ø²»ÊÇSËø£¬ÄÇÎÊÌâ¾Í½â¾öÁË£¿¿´¿´£º
ÊÂÎñT1Ö´ÐеÚÒ»²½£¬²éѯÁË»áÔ±µÄÕË»§¼Ç¼£¬ÏÔʽ¶Ô»áÔ±ÕË»§¼Ç¼¼ÓXËø£»ÕâʱºòÊÂÎñT2Ö´Ðе½µÚÒ»²½£¬ÔÚ²éѯ»áÔ±ÕË»§¼Ç¼³¢ÊÔ¼ÓXËøÊ±»áµÈ´ý£¬ÒòΪ¼Ç¼ÒѾ±»±ðµÄÊÂÎñ£¨ÊÂÎñT1£©¼ÓÁËXËø£»Ö®ºóÊÂÎñT1Ö´ÐеÚÈý²½£¬Ë³ÀûµÄ¸üÐÂÁ˼Ǽ£¬ÒòΪËüÒѾռÓмǼµÄXËø£»ÔÚÊÂÎñT1Ìá½»Ö®ºó£¬ÊÂÎñT2¾Í¿ÉÒÔ¼ÌÐøÍùÏÂÖ´ÐÐÁË£¬ËùÒÔËÀËøµÄÎÊÌâ½â¾öÁË¡£
ÓÅ»¯ºóµÄ¿Û¼õ²Ù×÷
start transaction
//µÚÒ»²½£¬²éѯÕË»§¿ÉÓÃÓà¶î
select ... from account where account_id = ... for update with rs
//µÚ¶þ²½£¬ÓàÁ¿¿ÛÈ¥Ôö¼ÓÁ¿£¬²¢¸³Öµ¸øÐ±äÁ¿NEW_BALANCE£¬Èç¹ûÓàÁ¿²»×ãÔò±¨´í¡£
set newBalance = dbBalance - changeAmount
if ( n