±à¼ÍƼö: |
ÏàÐÅ´ó¼Ò¶¼ÓùýÊÂÎñÒÔ¼°Á˽âËûµÄÌØµã£¬ÈçÔ×ÓÐÔ(Atomicity),Ò»ÖÂÐÔ(Consistency),¸ôÀëÐÍ(Isolation)ÒÔ¼°³Ö¾ÃÐÔ(Durability)µÈ¡£½ñÌìÏë¸ú´ó¼ÒÒ»ÆðÑо¿ÏÂÊÂÎñÄÚ²¿µ½µ×ÊÇÔõôʵÏֵġ£
±¾ÎÄÀ´×ÔËѺü£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£
|
|
ÔÚ½²½âǰÎÒÏëÏÈÅ׳ö¸öÎÊÌ⣺
ÊÂÎñÏëÒª×öµ½Ê²Ã´Ð§¹û£¿
°´ÎÒÀí½â£¬ÎÞ·ÇÊÇÒª×öµ½¿É¿¿ÐÔÒÔ¼°²¢·¢´¦Àí¡£
¿É¿¿ÐÔ£ºÊý¾Ý¿âÒª±£Ö¤µ±insert»òupdate²Ù×÷ʱÅ×Òì³£»òÕßÊý¾Ý¿âcrashµÄʱºòÐèÒª±£ÕÏÊý¾ÝµÄ²Ù×÷ǰºóµÄÒ»Ö£¬ÏëÒª×öµ½Õâ¸ö£¬ÎÒÐèÒªÖªµÀÎÒÐÞ¸Ä֮ǰºÍÐÞ¸ÄÖ®ºóµÄ״̬£¬ËùÒÔ¾ÍÓÐÁËundo
logºÍredo log¡£
²¢·¢´¦Àí£ºÒ²¾ÍÊÇ˵µ±¶à¸ö²¢·¢ÇëÇó¹ýÀ´£¬²¢ÇÒÆäÖÐÓÐÒ»¸öÇëÇóÊǶÔÊý¾ÝÐ޸IJÙ×÷µÄʱºò»áÓÐÓ°Ï죬ΪÁ˱ÜÃâ¶Áµ½ÔàÊý¾Ý£¬ËùÒÔÐèÒª¶ÔÊÂÎñÖ®¼äµÄ¶Áд½øÐиôÀ룬ÖÁÓÚ¸ôÀ뵽ɶ³Ì¶ÈµÃ¿´ÒµÎñϵͳµÄ³¡¾°ÁË£¬ÊµÏÖÕâ¸ö¾ÍµÃÓÃMySQL
µÄ¸ôÀë¼¶±ð¡£
ÏÂÃæÎÒÊ×ÏȽ²ÊµÏÖÊÂÎñ¹¦ÄܵÄÈý¸ö¼¼Êõ£¬·Ö±ðÊÇÈÕÖ¾Îļþ(redo log ºÍ undo log)£¬Ëø¼¼ÊõÒÔ¼°MVCC£¬È»ºóÔÙ½²ÊÂÎñµÄʵÏÖÔÀí£¬°üÀ¨Ô×ÓÐÔÊÇÔõôʵÏֵ쬏ôÀëÐÍÊÇÔõôʵÏֵĵȵȡ£×îºóÔÚ×öÒ»¸ö×ܽᣬϣÍû´ó¼ÒÄܹ»ÄÍÐÄ¿´Íê
redo logÓëundo log½éÉÜ
mysqlËø¼¼ÊõÒÔ¼°MVCC»ù´¡
ÊÂÎñµÄʵÏÖÔÀí
×ܽá
redo log Óë undo log½éÉÜ
1. redo log
ʲôÊÇredo log ?
redo log½Ð×öÖØ×öÈÕÖ¾£¬ÊÇÓÃÀ´ÊµÏÖÊÂÎñµÄ³Ö¾ÃÐÔ¡£¸ÃÈÕÖ¾ÎļþÓÉÁ½²¿·Ö×é³É£ºÖØ×öÈÕÖ¾»º³å£¨redo
log buffer£©ÒÔ¼°ÖØ×öÈÕÖ¾Îļþ£¨redo log£©,ǰÕßÊÇÔÚÄÚ´æÖУ¬ºóÕßÔÚ´ÅÅÌÖС£µ±ÊÂÎñÌá½»Ö®ºó»á°ÑËùÓÐÐÞ¸ÄÐÅÏ¢¶¼»á´æµ½¸ÃÈÕÖ¾ÖС£¼ÙÉèÓиö±í½Ð×ötb1(id,username)
ÏÖÔÚÒª²åÈëÊý¾Ý£¨3£¬ceshi£©

starttransaction; selectbalancefrombankwherename="zhangsan";//Éú³ÉÖØ×öÈÕÖ¾ balance=600updatebanksetbalance= balance-400;//Éú³ÉÖØ×öÈÕÖ¾ amount=400updatefinancesetamount =amount+400;commit;

redo log ÓÐʲô×÷Óã¿
mysql ΪÁËÌáÉýÐÔÄܲ»»á°Ñÿ´ÎµÄÐ޸Ķ¼ÊµÊ±Í¬²½µ½´ÅÅÌ£¬¶øÊÇ»áÏÈ´æµ½Boffer Pool(»º³å³Ø)ÀïÍ·£¬°ÑÕâ¸öµ±×÷»º´æÀ´Óá£È»ºóʹÓúǫ́Ïß³ÌÈ¥×ö»º³å³ØºÍ´ÅÅÌÖ®¼äµÄͬ²½¡£
ÄÇôÎÊÌâÀ´ÁË£¬Èç¹û»¹Ã»À´µÄͬ²½µÄʱºòå´»ú»ò¶ÏµçÁËÔõô°ì£¿»¹Ã»À´µÃ¼°Ö´ÐÐÉÏÃæÍ¼ÖкìÉ«µÄ²Ù×÷¡£ÕâÑù»áµ¼Ö¶ª²¿·ÖÒÑÌá½»ÊÂÎñµÄÐÞ¸ÄÐÅÏ¢£¡
ËùÒÔÒýÈëÁËredo logÀ´¼Ç¼Òѳɹ¦Ìá½»ÊÂÎñµÄÐÞ¸ÄÐÅÏ¢£¬²¢ÇÒ»á°Ñredo log³Ö¾Ã»¯µ½´ÅÅÌ£¬ÏµÍ³ÖØÆôÖ®ºóÔÚ¶ÁÈ¡redo
log»Ö¸´×îÐÂÊý¾Ý¡£
×ܽ᣺
redo logÊÇÓÃÀ´»Ö¸´Êý¾ÝµÄ ÓÃÓÚ±£ÕÏÒÑÌá½»ÊÂÎñµÄ³Ö¾Ã»¯ÌØÐÔ¡£
2.undo log
ʲôÊÇ undo log £¿
undo log ½Ð×ö»Ø¹öÈÕÖ¾£¬ÓÃÓڼǼÊý¾Ý±»ÐÞ¸ÄǰµÄÐÅÏ¢¡£ËûÕýºÃ¸úÇ°ÃæËù˵µÄÖØ×öÈÕÖ¾Ëù¼Ç¼µÄÏà·´£¬ÖØ×öÈÕÖ¾¼Ç¼Êý¾Ý±»Ð޸ĺóµÄÐÅÏ¢¡£undo
logÖ÷Òª¼Ç¼µÄÊÇÊý¾ÝµÄÂß¼±ä»¯£¬ÎªÁËÔÚ·¢Éú´íÎóʱ»Ø¹ö֮ǰµÄ²Ù×÷£¬ÐèÒª½«Ö®Ç°µÄ²Ù×÷¶¼¼Ç¼ÏÂÀ´£¬È»ºóÔÚ·¢Éú´íÎóʱ²Å¿ÉÒԻعö¡£
»¹ÓÃÉÏÃæÄÇÁ½Õűí

ÿ´ÎдÈëÊý¾Ý»òÕßÐÞ¸ÄÊý¾Ý֮ǰ¶¼»á°ÑÐÞ¸ÄǰµÄÐÅÏ¢¼Ç¼µ½ undo log¡£
undo log ÓÐʲô×÷Óã¿
undo log ¼Ç¼ÊÂÎñÐÞ¸Ä֮ǰ°æ±¾µÄÊý¾ÝÐÅÏ¢£¬Òò´Ë¼ÙÈçÓÉÓÚϵͳ´íÎó»òÕßrollback²Ù×÷¶ø»Ø¹öµÄ»°¿ÉÒÔ¸ù¾Ýundo
logµÄÐÅÏ¢À´½øÐлعöµ½Ã»±»ÐÞ¸ÄǰµÄ״̬¡£
×ܽ᣺
undo logÊÇÓÃÀ´»Ø¹öÊý¾ÝµÄÓÃÓÚ±£ÕÏ Î´Ìá½»ÊÂÎñµÄÔ×ÓÐÔ
mysqlËø¼¼ÊõÒÔ¼°MVCC»ù´¡
1. mysqlËø¼¼Êõ
µ±Óжà¸öÇëÇóÀ´¶ÁÈ¡±íÖеÄÊý¾Ýʱ¿ÉÒÔ²»²ÉÈ¡ÈκβÙ×÷£¬µ«ÊǶà¸öÇëÇóÀïÓжÁÇëÇó£¬ÓÖÓÐÐÞ¸ÄÇëÇóʱ±ØÐëÓÐÒ»ÖÖ´ëÊ©À´½øÐв¢·¢¿ØÖÆ¡£²»È»ºÜÓпÉÄÜ»áÔì³É²»Ò»Ö¡£
¶ÁÐ´Ëø
½â¾öÉÏÊöÎÊÌâºÜ¼òµ¥£¬Ö»ÐèÓÃÁ½ÖÖËøµÄ×éºÏÀ´¶Ô¶ÁдÇëÇó½øÐпØÖƼ´¿É£¬ÕâÁ½ÖÖËø±»³ÆÎª£º
¹²ÏíËø(shared lock),ÓÖ½Ð×ö"¶ÁËø"
¶ÁËøÊÇ¿ÉÒÔ¹²ÏíµÄ£¬»òÕß˵¶à¸ö¶ÁÇëÇó¿ÉÒÔ¹²ÏíÒ»°ÑËø¶ÁÊý¾Ý£¬²»»áÔì³É×èÈû¡£
ÅÅËûËø(exclusive lock),ÓÖ½Ð×ö"Ð´Ëø"
Ð´Ëø»áÅųâÆäËûËùÓлñÈ¡ËøµÄÇëÇó£¬Ò»Ö±×èÈû£¬Ö±µ½Ð´ÈëÍê³ÉÊÍ·ÅËø¡£

×ܽ᣺
ͨ¹ý¶ÁÐ´Ëø£¬¿ÉÒÔ×öµ½¶Á¶Á¿ÉÒÔ²¢ÐУ¬µ«ÊDz»ÄÜ×öµ½Ð´¶Á£¬Ð´Ð´²¢ÐÐ
ÊÂÎñµÄ¸ôÀëÐÔ¾ÍÊǸù¾Ý¶ÁÐ´ËøÀ´ÊµÏֵģ¡£¡£¡Õâ¸öºóÃæÔÙ˵¡£
2. MVCC»ù´¡
MVCC (MultiVersion Concurrency Control) ½Ð×ö¶à°æ±¾²¢·¢¿ØÖÆ¡£
InnoDBµÄ MVCC £¬ÊÇͨ¹ýÔÚÿÐмǼµÄºóÃæ±£´æÁ½¸öÒþ²ØµÄÁÐÀ´ÊµÏֵġ£ÕâÁ½¸öÁУ¬Ò»¸ö±£´æÁËÐеĴ´½¨Ê±¼ä£¬Ò»¸ö±£´æÁËÐеĹýÆÚʱ¼ä£¬µ±È»´æ´¢µÄ²¢²»ÊÇʵ¼ÊµÄʱ¼äÖµ£¬¶øÊÇϵͳ°æ±¾ºÅ
ÒÔÉÏÆ¬¶ÎÕª×Ô¡¶¸ßÐÔÄÜMysql¡·Õâ±¾Êé¶ÔMVCCµÄ¶¨Òå¡£ËûµÄÖ÷ҪʵÏÖ˼ÏëÊÇͨ¹ýÊý¾Ý¶à°æ±¾À´×öµ½¶Áд·ÖÀë¡£´Ó¶øÊµÏÖ²»¼ÓËø¶Á½ø¶ø×öµ½¶Áд²¢ÐС£
MVCCÔÚmysqlÖеÄʵÏÖÒÀÀµµÄÊÇundo logÓëread view
undo log :undo log ÖмǼijÐÐÊý¾ÝµÄ¶à¸ö°æ±¾µÄÊý¾Ý¡£
read view :ÓÃÀ´Åжϵ±Ç°°æ±¾Êý¾ÝµÄ¿É¼ûÐÔ

ÊÂÎñµÄʵÏÖ
Ç°Ãæ½²µÄÖØ×öÈÕÖ¾£¬»Ø¹öÈÕÖ¾ÒÔ¼°Ëø¼¼Êõ¾ÍÊÇʵÏÖÊÂÎñµÄ»ù´¡¡£
ÊÂÎñµÄÔ×ÓÐÔÊÇͨ¹ýundologÀ´ÊµÏÖµÄÊÂÎñµÄ³Ö¾ÃÐÔÐÔÊÇͨ¹ýredologÀ´ÊµÏÖµÄÊÂÎñµÄ¸ôÀëÐÔÊÇͨ¹ý(¶ÁÐ´Ëø+MVCC)À´ÊµÏֵĶøÊÂÎñµÄÖÕ¼«´ó
boss Ò»ÖÂÐÔÊÇͨ¹ýÔ×ÓÐÔ£¬³Ö¾ÃÐÔ£¬¸ôÀëÐÔÀ´ÊµÏֵģ¡£¡£¡
Ô×ÓÐÔ£¬³Ö¾ÃÐÔ£¬¸ôÀëÐÔÕÛÌÚ°ëÌìµÄÄ¿µÄÒ²ÊÇΪÁ˱£ÕÏÊý¾ÝµÄÒ»ÖÂÐÔ£¡
×ÜÖ®£¬ACIDÖ»ÊǸö¸ÅÄÊÂÎñ×îÖÕÄ¿µÄÊÇÒª±£ÕÏÊý¾ÝµÄ¿É¿¿ÐÔ£¬Ò»ÖÂÐÔ¡£
1.Ô×ÓÐÔµÄʵÏÖ
ʲôÊÇÔ×ÓÐÔ£º
Ò»¸öÊÂÎñ±ØÐë±»ÊÓΪ²»¿É·Ö¸îµÄ×îС¹¤×÷µ¥Î»£¬Ò»¸öÊÂÎñÖеÄËùÓвÙ×÷Ҫôȫ²¿³É¹¦Ìá½»£¬ÒªÃ´È«²¿Ê§°Ü»Ø¹ö£¬¶ÔÓÚÒ»¸öÊÂÎñÀ´Ëµ²»¿ÉÄÜÖ»Ö´ÐÐÆäÖеIJ¿·Ö²Ù×÷£¬Õâ¾ÍÊÇÊÂÎñµÄÔ×ÓÐÔ¡£
ÉÏÃæÕâ¶Î»°È¡×Ô¡¶¸ßÐÔÄÜMySQL¡·Õâ±¾Êé¶ÔÔ×ÓÐԵ͍Ò壬Ô×ÓÐÔ¿ÉÒÔ¸ÅÀ¨Îª¾ÍÊÇҪʵÏÖҪôȫ²¿Ê§°Ü£¬ÒªÃ´È«²¿³É¹¦¡£
ÒÔÉϸÅÄîÏàÐÅ´ó¼Ò»ï¶ù¶¼Á˽⣬ÄÇôÊý¾Ý¿âÊÇÔõôʵÏÖµÄÄØ£¿¾ÍÊÇͨ¹ý»Ø¹ö²Ù×÷¡£Ëùν»Ø¹ö²Ù×÷¾ÍÊǵ±·¢Éú´íÎóÒì³£»òÕßÏÔʽµÄÖ´ÐÐrollbackÓï¾äʱÐèÒª°ÑÊý¾Ý»¹Ôµ½ÔÏȵÄÄ£Ñù£¬ËùÒÔÕâʱºò¾ÍÐèÒªÓõ½undo
logÀ´½øÐлعö£¬½ÓÏÂÀ´¿´Ò»ÏÂundo logÔÚʵÏÖÊÂÎñÔ×ÓÐÔʱÔõô·¢»Ó×÷ÓõÄ
1.1 undo log µÄÉú³É
¼ÙÉèÓÐÁ½¸ö±í bankºÍfinance£¬±íÖÐÔʼÊý¾ÝÈçͼËùʾ£¬µ±½øÐвåÈ룬ɾ³ýÒÔ¼°¸üвÙ×÷ʱÉú³ÉµÄundo
logÈçÏÂÃæÍ¼Ëùʾ£º


´ÓÉÏͼ¿ÉÒÔÁ˽⵽Êý¾ÝµÄ±ä¸ü¶¼°éËæ×ŻعöÈÕÖ¾µÄ²úÉú£º
(1) ²úÉúÁ˱»ÐÞ¸ÄǰÊý¾Ý(zhangsan,1000) µÄ»Ø¹öÈÕÖ¾
(2) ²úÉúÁ˱»ÐÞ¸ÄǰÊý¾Ý(zhangsan,0) µÄ»Ø¹öÈÕÖ¾
¸ù¾ÝÉÏÃæÁ÷³Ì¿ÉÒԵóöÈçϽáÂÛ£º
1.ÿÌõÊý¾Ý±ä¸ü(insert/update/delete)²Ù×÷¶¼°éËæÒ»Ìõundo logµÄÉú³É,²¢ÇһعöÈÕÖ¾±ØÐëÏÈÓÚÊý¾Ý³Ö¾Ã»¯µ½´ÅÅÌÉÏ
2.ËùνµÄ»Ø¹ö¾ÍÊǸù¾Ý»Ø¹öÈÕÖ¾×öÄæÏò²Ù×÷£¬±ÈÈçdeleteµÄÄæÏò²Ù×÷Ϊinsert£¬insertµÄÄæÏò²Ù×÷Ϊdelete£¬updateµÄÄæÏòΪupdateµÈ¡£
˼¿¼£ºÎªÊ²Ã´ÏÈдÈÕÖ¾ºóдÊý¾Ý¿â£¿--- ÉÔºó×ö½âÊÍ
1.2 ¸ù¾Ýundo log ½øÐлعö
ΪÁË×öµ½Í¬Ê±³É¹¦»òÕßʧ°Ü£¬µ±ÏµÍ³·¢Éú´íÎó»òÕßÖ´ÐÐrollback²Ù×÷ʱÐèÒª¸ù¾Ýundo log ½øÐлعö

»Ø¹ö²Ù×÷¾ÍÊÇÒª»¹Ôµ½ÔÀ´µÄ״̬£¬undo log¼Ç¼ÁËÊý¾Ý±»ÐÞ¸ÄǰµÄÐÅÏ¢ÒÔ¼°ÐÂÔöºÍ±»É¾³ýµÄÊý¾ÝÐÅÏ¢£¬¸ù¾Ýundo
logÉú³É»Ø¹öÓï¾ä£¬±ÈÈ磺
(1) Èç¹ûÔڻعöÈÕÖ¾ÀïÓÐÐÂÔöÊý¾Ý¼Ç¼£¬ÔòÉú³Éɾ³ý¸ÃÌõµÄÓï¾ä
(2) Èç¹ûÔڻعöÈÕÖ¾ÀïÓÐɾ³ýÊý¾Ý¼Ç¼£¬ÔòÉú³ÉÉú³É¸ÃÌõµÄÓï¾ä
(3) Èç¹ûÔڻعöÈÕÖ¾ÀïÓÐÐÞ¸ÄÊý¾Ý¼Ç¼£¬ÔòÉú³ÉÐ޸ĵ½ÔÏÈÊý¾ÝµÄÓï¾ä
2.³Ö¾ÃÐÔµÄʵÏÖ
ÊÂÎñÒ»µ©Ìá½»£¬ÆäËù×öµÄÐ޸ĻáÓÀ¾Ã±£´æµ½Êý¾Ý¿âÖУ¬´Ëʱ¼´Ê¹ÏµÍ³±ÀÀ£Ð޸ĵÄÊý¾ÝÒ²²»»á¶ªÊ§¡£
ÏÈÁ˽âÒ»ÏÂMySQLµÄÊý¾Ý´æ´¢»úÖÆ£¬MySQLµÄ±íÊý¾ÝÊÇ´æ·ÅÔÚ´ÅÅÌÉϵģ¬Òò´ËÏëÒª´æÈ¡µÄʱºò¶¼Òª¾Àú´ÅÅÌIO,È»¶ø¼´Ê¹ÊÇʹÓÃSSD´ÅÅÌIOÒ²ÊǷdz£ÏûºÄÐÔÄܵġ£Îª´Ë£¬ÎªÁËÌáÉýÐÔÄÜInnoDBÌṩÁË»º³å³Ø(Buffer
Pool)£¬Buffer PoolÖаüº¬ÁË´ÅÅÌÊý¾ÝÒ³µÄÓ³É䣬¿ÉÒÔµ±×ö»º´æÀ´Ê¹Óãº
¶ÁÊý¾Ý£º»áÊ×ÏÈ´Ó»º³å³ØÖжÁÈ¡£¬Èç¹û»º³å³ØÖÐûÓУ¬Ôò´Ó´ÅÅ̶ÁÈ¡ÔÙ·ÅÈ뻺³å³Ø£»
дÊý¾Ý£º»áÊ×ÏÈдÈ뻺³å³Ø£¬»º³å³ØÖеÄÊý¾Ý»á¶¨ÆÚͬ²½µ½´ÅÅÌÖУ»
ÉÏÃæÕâÖÖ»º³å³ØµÄ´ëÊ©ËäÈ»ÔÚÐÔÄÜ·½Ãæ´øÀ´ÁËÖʵķÉÔ¾£¬µ«ÊÇËüÒ²´øÀ´ÁËеÄÎÊÌ⣬µ±MySQLϵͳ崻ú£¬¶ÏµçµÄʱºò¿ÉÄܻᶪÊý¾Ý£¡£¡£¡
ÒòΪÎÒÃǵÄÊý¾ÝÒѾÌá½»ÁË£¬µ«´ËʱÊÇÔÚ»º³å³ØÀïÍ·£¬»¹Ã»À´µÃ¼°ÔÚ´ÅÅ̳־û¯£¬ËùÒÔÎÒÃǼ±ÐèÒ»ÖÖ»úÖÆÐèÒª´æÒ»ÏÂÒÑÌá½»ÊÂÎñµÄÊý¾Ý£¬Îª»Ö¸´Êý¾ÝʹÓá£
ÓÚÊÇ redo log¾ÍÅÉÉÏÓó¡ÁË¡£ÏÂÃæ¿´ÏÂredo logÊÇʲôʱºò²úÉúµÄ

¼ÈÈ»redo logÒ²ÐèÒª´æ´¢£¬Ò²Éæ¼°´ÅÅÌIOΪɶ»¹ÓÃËü£¿
£¨1£©redo log µÄ´æ´¢ÊÇ˳Ðò´æ´¢£¬¶ø»º´æÍ¬²½ÊÇËæ»ú²Ù×÷¡£
£¨2£©»º´æÍ¬²½ÊÇÒÔÊý¾ÝҳΪµ¥Î»µÄ£¬Ã¿´Î´«ÊäµÄÊý¾Ý´óС´óÓÚredo log¡£
3.¸ôÀëÐÔʵÏÖ
¸ôÀëÐÔÊÇÊÂÎñACIDÌØÐÔÀï×ÔÓµÄÒ»¸ö¡£ÔÚSQL±ê×¼ÀﶨÒåÁËËÄÖÖ¸ôÀë¼¶±ð£¬Ã¿Ò»ÖÖ¼¶±ð¶¼¹æ¶¨Ò»¸öÊÂÎñÖеÄÐ޸ģ¬ÄÄЩÊÇÊÂÎñÖ®¼ä¿É¼ûµÄ£¬ÄÄЩÊDz»¿É¼ûµÄ¡£
¼¶±ðÔ½µÍµÄ¸ôÀë¼¶±ð¿ÉÒÔÖ´ÐÐÔ½¸ßµÄ²¢·¢£¬µ«Í¬Ê±ÊµÏÖ¸´ÔÓ¶ÈÒÔ¼°¿ªÏúÒ²Ô½´ó¡£
MySQL¸ôÀë¼¶±ðÓÐÒÔÏÂËÄÖÖ£¨¼¶±ðÓɵ͵½¸ß£©£º
READUNCOMMITED(δÌá½»¶Á)
READCOMMITED(Ìá½»¶Á)
REPEATABLEREAD(¿ÉÖØ¸´¶Á)
SERIALIZABLE (¿ÉÖØ¸´¶Á)
Ö»Òª³¹µ×Àí½âÁ˸ôÀë¼¶±ðÒÔ¼°ËûµÄʵÏÖÔÀí¾ÍÏ൱ÓÚÀí½âÁËACIDÀïµÄ¸ôÀëÐÍ¡£Ç°ÃæËµ¹ýÔ×ÓÐÔ£¬¸ôÀëÐÔ£¬³Ö¾ÃÐÔµÄÄ¿µÄ¶¼ÊÇΪÁËÒª×öµ½Ò»ÖÂÐÔ£¬µ«¸ôÀëÐ͸úÆäËûÁ½¸öÓÐËùÇø±ð£¬Ô×ÓÐԺͳ־ÃÐÔÊÇΪÁËҪʵÏÖÊý¾ÝµÄ¿ÉÐÔ±£ÕÏ¿¿£¬±ÈÈçÒª×öµ½å´»úºóµÄ»Ö¸´£¬ÒÔ¼°´íÎóºóµÄ»Ø¹ö¡£
ÄÇô¸ôÀëÐÔÊÇÒª×öµ½Ê²Ã´ÄØ£¿¸ôÀëÐÔÊÇÒª¹ÜÀí¶à¸ö²¢·¢¶ÁдÇëÇóµÄ·ÃÎÊ˳Ðò¡£ÕâÖÖ˳Ðò°üÀ¨´®ÐлòÕßÊDz¢ÐÐ
˵Ã÷Ò»µã£¬Ð´ÇëÇó²»½ö½öÊÇÖ¸insert²Ù×÷£¬ÓÖ°üÀ¨update²Ù×÷¡£

×ÜÖ®£¬´Ó¸ôÀëÐÔµÄʵÏÖ¿ÉÒÔ¿´³öÕâÊÇÒ»³¡Êý¾ÝµÄ ¿É¿¿ÐÔÓëÐÔÄÜÖ®¼äµÄȨºâ£º
¿É¿¿ÐÔÐԸߵ쬲¢·¢ÐÔÄܵÍ(±ÈÈçSerializable)¡£¿É¿¿ÐԵ͵쬲¢·¢ÐÔÄܸß(±ÈÈç Read
Uncommited)
READ UNCOMMITTED
ÔÚREAD UNCOMMITTED¸ôÀë¼¶±ðÏ£¬ÊÂÎñÖеÄÐ޸ļ´Ê¹»¹Ã»Ìá½»£¬¶ÔÆäËûÊÂÎñÊǿɼûµÄ¡£ÊÂÎñ¿ÉÒÔ¶ÁȡδÌá½»µÄÊý¾Ý£¬Ôì³ÉÔà¶Á¡£
ÒòΪ¶Á²»»á¼ÓÈκÎËø£¬ËùÒÔд²Ù×÷ÔÚ¶ÁµÄ¹ý³ÌÖÐÐÞ¸ÄÊý¾Ý£¬ËùÒÔ»áÔì³ÉÔà¶Á¡£ºÃ´¦ÊÇ¿ÉÒÔÌáÉý²¢·¢´¦ÀíÐÔÄÜ£¬ÄÜ×öµ½¶Áд²¢ÐС£
»»¾ä»°Ëµ£¬¶ÁµÄ²Ù×÷²»ÄÜÅųâдÇëÇó¡£

Óŵ㣺¶Áд²¢ÐУ¬ÐÔÄܸß
ȱµã£ºÔì³ÉÔà¶Á
READ COMMITTED
Ò»¸öÊÂÎñµÄÐÞ¸ÄÔÚËûÌύ֮ǰµÄËùÓÐÐ޸ģ¬¶ÔÆäËûÊÂÎñ¶¼ÊDz»¿É¼ûµÄ¡£ÆäËûÊÂÎñÄܶÁµ½ÒÑÌá½»µÄÐ޸ı仯¡£Ôںܶೡ¾°ÏÂÕâÖÖÂß¼ÊÇ¿ÉÒÔ½ÓÊܵġ£
InnoDBÔÚ READ COMMITTED£¬Ê¹ÓÃÅÅËüËø,¶ÁÈ¡Êý¾Ý²»¼ÓËø¶øÊÇʹÓÃÁËMVCC»úÖÆ¡£»òÕß»»¾ä»°ËµËû²ÉÓÃÁ˶Áд·ÖÀë»úÖÆ¡£
µ«ÊǸü¶±ð»á²úÉú²»¿ÉÖØ¶ÁÒÔ¼°»Ã¶ÁÎÊÌâ¡£
ʲôÊDz»¿ÉÖØ¶Á£¿
ÔÚÒ»¸öÊÂÎñÄÚ¶à´Î¶ÁÈ¡µÄ½á¹û²»Ò»Ñù¡£
Ϊʲô»á²úÉú²»¿ÉÖØ¸´¶Á£¿
Õâ¸ú READ COMMITTED ¼¶±ðϵÄMVCC»úÖÆÓйØÏµ£¬ÔڸøôÀë¼¶±ðÏÂÿ´Î selectµÄʱºòÐÂÉú³ÉÒ»¸ö°æ±¾ºÅ£¬ËùÒÔÿ´ÎselectµÄʱºò¶ÁµÄ²»ÊÇÒ»¸ö¸±±¾¶øÊDz»Í¬µÄ¸±±¾¡£
ÔÚÿ´ÎselectÖ®¼äÓÐÆäËûÊÂÎñ¸üÐÂÁËÎÒÃǶÁÈ¡µÄÊý¾Ý²¢Ìá½»ÁË£¬ÄǾͳöÏÖÁ˲»¿ÉÖØ¸´¶Á
REPEATABLE READ(MysqlĬÈϸôÀë¼¶±ð)
ÔÚÒ»¸öÊÂÎñÄڵĶà´Î¶ÁÈ¡µÄ½á¹ûÊÇÒ»ÑùµÄ¡£ÕâÖÖ¼¶±ðÏ¿ÉÒÔ±ÜÃ⣬Ôà¶Á£¬²»¿ÉÖØ¸´¶ÁµÈ²éѯÎÊÌâ¡£mysql
ÓÐÁ½ÖÖ»úÖÆ¿ÉÒÔ´ïµ½ÕâÖÖ¸ôÀë¼¶±ðµÄЧ¹û£¬·Ö±ðÊDzÉÓöÁÐ´ËøÒÔ¼°MVCC¡£
²ÉÓöÁÐ´ËøÊµÏÖ£º

ΪʲôÄÜ¿ÉÖØ¸´¶Á£¿Ö»ÒªÃ»ÊͷŶÁËø£¬ÔڴζÁµÄʱºò»¹ÊÇ¿ÉÒÔ¶Áµ½µÚÒ»´Î¶ÁµÄÊý¾Ý¡£
Óŵ㣺ʵÏÖÆðÀ´¼òµ¥
ȱµã£ºÎÞ·¨×öµ½¶Áд²¢ÐÐ
²ÉÓÃMVCCʵÏÖ£º

ΪʲôÄÜ¿ÉÖØ¸´¶Á£¿ÒòΪ¶à´Î¶ÁȡֻÉú³ÉÒ»¸ö°æ±¾£¬¶Áµ½µÄ×ÔÈ»ÊÇÏàͬÊý¾Ý¡£
Óŵ㣺¶Áд²¢ÐÐ
ȱµã£ºÊµÏֵĸ´ÔӶȸß
µ«ÊÇÔڸøôÀë¼¶±ðÏÂÈÔ»á´æÔڻöÁµÄÎÊÌ⣬¹ØÓڻöÁµÄ½â¾öÎÒ´òËãÁí¿ªÒ»ÆªÀ´½éÉÜ¡£
SERIALIZABLE
¸Ã¸ôÀë¼¶±ðÀí½âÆðÀ´×î¼òµ¥£¬ÊµÏÖÒ²×î¼òµ¥¡£ÔÚ¸ôÀë¼¶±ðϳýÁ˲»»áÔì³ÉÊý¾Ý²»Ò»ÖÂÎÊÌ⣬ûÆäËûÓŵ㡣


--Õª×Ô¡¶¸ßÐÔÄÜMysql¡·
4.Ò»ÖÂÐÔµÄʵÏÖ
Êý¾Ý¿â×ÜÊÇ´ÓÒ»¸öÒ»ÖÂÐÔµÄ×´Ì¬×ªÒÆµ½ÁíÒ»¸öÒ»ÖÂÐÔµÄ״̬¡£
ÏÂÃæ¾Ù¸öÀý×Ó£¬zhangsan ´ÓÒøÐп¨×ª400µ½Àí²ÆÕË»§:
starttransaction; selectbalancefrombankwherename
="zhangsan";//Éú³ÉÖØ×öÈÕÖ¾
balance=600updatebanksetbalance =balance-400;//Éú³ÉÖØ×öÈÕÖ¾
amount=400updatefinancesetamount =amount+400;commit;
1.¼ÙÈçÖ´ÐÐÍê update bank set balance =
balance - 400;Ö®·¢ÉúÒì³£ÁË£¬ÒøÐп¨µÄǮҲ²»ÄÜÆ½°×Î޹ʵļõÉÙ£¬¶øÊǻعöµ½×î³õ״̬¡£
2.ÓÖ»òÕßÊÂÎñÌá½»Ö®ºó£¬»º³å³Ø»¹Ã»Í¬²½µ½´ÅÅ̵Äʱºòå´»úÁË£¬ÕâÒ²ÊDz»ÄܽÓÊܵģ¬Ó¦¸ÃÔÚÖØÆôµÄʱºò»Ö¸´²¢³Ö¾Ã»¯¡£
3.¼ÙÈçÓв¢·¢ÊÂÎñÇëÇóµÄʱºòÒ²Ó¦¸Ã×öºÃÊÂÎñÖ®¼äµÄ¿É¼ûÐÔÎÊÌ⣬±ÜÃâÔì³ÉÔà¶Á£¬²»¿ÉÖØ¸´¶Á£¬»Ã¶ÁµÈ¡£ÔÚÉæ¼°²¢·¢µÄÇé¿öÏÂÍùÍùÔÚÐÔÄܺÍÒ»ÖÂÐÔÖ®¼ä×öƽºâ£¬×öÒ»¶¨µÄÈ¡ÉᣬËùÒÔ¸ôÀëÐÔÒ²ÊǶÔÒ»ÖÂÐÔµÄÒ»ÖÖÆÆ»µ¡£
×ܽá
±¾³ö·¢µãÊÇÏë½²Ò»ÏÂMysqlµÄÊÂÎñµÄʵÏÖÔÀí¡£
ʵÏÖÊÂÎñ²ÉÈ¡ÁËÄÄЩ¼¼ÊõÒÔ¼°Ë¼Ï룿
Ô×ÓÐÔ£º ʹÓà undo log £¬´Ó¶ø´ïµ½»Ø¹ö
³Ö¾ÃÐÔ£º ʹÓà redo log£¬´Ó¶ø´ïµ½¹ÊÕϺó»Ö¸´
¸ôÀëÐÔ£º ʹÓÃËøÒÔ¼°MVCC,ÔËÓõÄÓÅ»¯Ë¼ÏëÓжÁд·ÖÀ룬¶Á¶Á²¢ÐУ¬¶Áд²¢ÐÐ
Ò»ÖÂÐÔ£º ͨ¹ý»Ø¹ö£¬ÒÔ¼°»Ö¸´£¬ºÍÔÚ²¢·¢»·¾³ÏµĸôÀë×öµ½Ò»ÖÂÐÔ¡£
|