±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚxybaby£¬·Ö²¼Ê½ÊÂÎñÊÇÖ¸ÊÂÎñµÄ²ÎÓëÕß¡¢Ö§³ÖÊÂÎñµÄ·þÎñÆ÷¡¢×ÊÔ´·þÎñÆ÷ÒÔ¼°ÊÂÎñ¹ÜÀíÆ÷·Ö±ðλÓÚ²»Í¬µÄ·Ö²¼Ê½ÏµÍ³µÄ²»Í¬½ÚµãÖ®ÉÏ¡£ ¡£
|
|
ÕýÎÄ
˼¿¼Õâ¸öÎÊÌâµÄ³õÖÔ£¬ÊÇÓÐÒ»´Î¸øÅóÓÑתÕË£¬½á¹ûÎÒµÄÇ®±»¿ÛÁË£¬ÅóÓÑûÊÕµ½Ç®¡£¶øÎÒ֮ǰһֱÈÏÎªÒøÐÐתÕËÒ»¶¨ÊÇÓÉÊÂÎñ±£Ö¤Ç¿Ò»ÖÂÐԵģ¬ÓÚÊÇѧϰ¡¢×ܽáÁËһϷֲ¼Ê½ÊÂÎñµÄ¸÷ÖÖÀíÂÛ¡¢·½·¨¡£
ÊÂÎñÊÇÒ»¸ö·Ç³£¹ãÒåµÄ´Ê»ã£¬¸÷Ðи÷Òµ½â¶Á¶¼²»Ò»Ñù¡£¶ÔÓÚ³ÌÐòÔ±£¬ÊÂÎñµÈ¼ÛÓÚTransaction£¬ÊÇÖ¸Ò»×éÁ¬ÐøµÄ²Ù×÷£¬ÕâЩ²Ù×÷×éºÏ³ÉÒ»¸öÂß¼µÄ¡¢ÍêÕûµÄ²Ù×÷¡£¼´Õâ×é²Ù×÷Ö´ÐÐǰºó£¬ÏµÍ³ÐèÒª´¦ÓÚÒ»¸ö¿ÉÔ¤ÖªµÄ¡¢Ò»ÖµÄ״̬¡£Òò´Ë£¬ÕâÒ»×é²Ù×÷Ҫô¶¼³É¹¦Ö´ÐУ¬ÒªÃ´¶¼²»ÄÜÖ´ÐУ»Èç¹û²¿·Ö³É¹¦£¬²¿·Öʧ°Ü£¬³É¹¦µÄ²¿·ÖÐèÒª»Ø¹ö£¨rollback£©¡£
æ¢ÃÃÆª£º ÔÙÂÛ·Ö²¼Ê½ÊÂÎñ£º´ÓÀíÂÛµ½Êµ¼ù
¹ØÏµÐÍÊý¾Ý¿âÊÂÎñ
´ó¶àÊýÈË¿ÉÄܺÍÎÒÒ»Ñù£¬µÚÒ»´ÎÌý˵ÊÂÎñÊÇÔÚѧϰ¹ØÏµÐÍÊý¾Ý¿â£¨mysql¡¢sql server¡¢Oracle£©µÄʱºò£¬ÔÚ¹ØÏµÐÍÊý¾Ý¿âÖУ¬Èç¹ûÒ»×é²Ù×÷Âú×ãACIDÌØÐÔ£¬ÄÇô³ÆÖ®ÎªÒ»¸öÊÂÎñ¡£¹ØÓÚ¹ØÏµÐÍÊý¾Ý¿âµÄACID ÌØÐÔ£¬²»¹ÜÊǽ̲ϹÊÇÍøÂçÉ϶¼ÓдóÁ¿µÄ×ÊÁÏ£¬ÕâÀïÖ»¼òµ¥½éÉÜ¡£
A£¨Atomic£©£ºÔ×ÓÐÔ£¬¹¹³ÉÊÂÎñµÄËùÓвÙ×÷£¬ÒªÃ´¶¼Ö´ÐÐÍê³É£¬ÒªÃ´È«²¿²»Ö´ÐУ¬²»¿ÉÄܳöÏÖ²¿·Ö³É¹¦²¿·Öʧ°ÜµÄÇé¿ö
C£¨Consistency£©£ºÒ»ÖÂÐÔ£¬ÔÚÊÂÎñÖ´ÐÐǰºó£¬Êý¾Ý¿âµÄÒ»ÖÂÐÔÔ¼ÊøÃ»Óб»ÆÆ»µ¡£ÕâÀïµÄÒ»ÖÂÐÔº¬ÒåºóÃæ»áÏêϸ½âÊÍ
I£¨Isolation£©£º¸ôÀëÐÔ£¬Êý¾Ý¿âÖеÄÊÂÎñÒ»°ã¶¼ÊDz¢·¢µÄ£¬¸ôÀëÐÔÊÇÖ¸²¢·¢µÄÁ½¸öÊÂÎñµÄÖ´Ðл¥²»¸ÉÈÅ£¬Ò»¸öÊÂÎñ²»ÄÜ¿´µ½ÆäËûÊÂÎñÔËÐйý³ÌµÄÖмä״̬
D£¨Durability£©£º³Ö¾ÃÐÔ£¬ÊÂÎñÍê³ÉÖ®ºó£¬¸ÃÊÂÎñ¶ÔÊý¾ÝµÄ¸ü¸Ä»á±»³Ö¾Ã»¯µ½Êý¾Ý¿â£¬ÇÒ²»»á±»»Ø¹ö¡£
ÎÒÃǾÙÒ»¸ö¼òµ¥µÄתÕ˵ÄÀý×Ó£¬Óû§A¸øÍæ¼ÒBת100¿éÇ®£¬ÄÇÃ´Éæ¼°µ½Á½¸ö²Ù×÷£ºÍæ¼ÒAµÄÕË»§¿Û100Ôª£¬Íæ¼ÒBµÄÕË»§¼Ó100Ôª¡£¼´
UserA.account -= 100
UserB.account += 100 |
Ô×ÓÐԺܺÃÀí½â£¬ÕâÁ½¸ö²Ù×÷Ҫô¶¼³É¹¦£¬ÒªÃ´¶¼²»Ö´ÐУ¨¸ü׼ȷµÄÊÇ´ÓЧ¹ûÉÏÀ´¿´µÈ¼ÛÓÚ¶¼Ã»ÓÐÖ´ÐУ©¡£²»¿ÉÄܳöÏÖÓû§AµÄÇ®¼õÉÙÁ˶øÓû§BµÄǮûÔö¼ÓµÄÇé¿ö£¬Óû§ÊDz»ÔÊÐíµÄ£»¸ü²»¿ÉÄܳöÏÖÓû§BµÄÇ®Ôö¼Ó ¶ø Óû§AµÄǮûÓмõÉÙµÄÇé¿ö£¬ÒøÐÐÊǾø¶Ô²»¸ÉµÄ¡£
Ò»ÖÂÐÔ˵һÆðÀ´´ó¼Ò¶¼¶®£¬µ«ÊÇÉÆðÀ´Ò²ÊÇËÆ¶®·Ç¶®¡£ACIDÖеÄÒ»ÖÂÐÔ£¬ÍøÂçÉϵĽéÉܶ¼ºÜÄ£ºý£¬¶¼ÊÇ˵Ҫ´¦ÓÚÒ»ÖµÄ״̬£¬ÄÇʲôÊÇÒ»ÖµÄ×´Ì¬ÄØ£¬±ÈÈçתÕ˲Ù×÷ÖУ¬A¿ÛÇ®£¬B¼ÓÇ®£¬ABµÄÇ®µÄ×ÛºÏÊÇÒ»¶¨µÄ£¬Õâ¸öÊÇ·ñÊôÓÚACIDÖеÄConsistencyÄØ£¿ÎÒ¾õµÃ²»Êǵģ¬ Wiki Transaction_processing ºÍ Wiki£º ACID ·Ö±ðÊÇÕâôÃèÊöµÄ
Consistency: A transaction is a correct transformation of the state. The actions taken as a group do not violate any of the integrity constraints associated with the state.
The consistency property ensures that any transaction will bring the database from one valid state to another. Any data written to the database must be valid according to all defined rules, including constraints, cascades, triggers, and any combination thereof. This does not guarantee correctness of the transaction in all ways the application programmer might have wanted (that is the responsibility of application-level code), but merely that any programming errors cannot result in the violation of any defined rules.
ÉÏÃæºÚÉ«¼Ó´ÖµÄ²¿·ÖÖ¸³ö£¬ACIDÖеÄÒ»ÖÂÐÔÊÇÖ¸ÍêÕûÐÔÔ¼Êø²»±»ÆÆ»µ£¬ÍêÕûÐÔ°üº¬ÊµÌåÍêÕûÐÔ£¨Ö÷ÊôÐÔ²»Îª¿Õ£©¡¢²ÎÕÕÍêÕûÐÔ£¨Íâ¼ü±ØÐë´æÔÚÔ±íÖУ©¡¢Óû§×Ô¶¨ÒåµÄÍêÕûÐÔ¡£Óû§×Ô¶¨ÒåµÄÍêÕûÐÔ±ÈÈçÁÐÖµ·Ç¿Õ£¨not null£©¡¢ÁÐֵΨһ£¨unique£©¡¢ÁÐÖµÊÇ·ñÂú×ãÒ»¸öbool±í´ïʽ£¨checkÓï¾ä£¬ÈçÐÔ±ðÖ»ÄÜÓÐÁ½¸öÖµ¡¢ËêÊýÊÇÒ»¶¨·¶Î§ÄÚµÄÕûÊýµÈ£©£¬ÀýÈçage smallint CHECK (age >=0 AND age <= 120).Êý¾Ý¿â±£Ö¤ageµÄÖµÔÚ[0, 120]µÄ·¶Î§£¬Èç¹û²»ÔÚÕâ¸ö·¶ÎÄ£¬ÄÇô¸üвÙ×÷ʧ°Ü£¬ÊÂÎñÒ²»áʧ°Ü¡£ÁíÍ⣬ÏòmysqlÖеÄcascade£¬ÒÔ¼°´¥·¢Æ÷£¨trigger£©¶¼ÊôÓÚÓû§×Ô¶¨ÒåµÄÍêÕûÐÔÔ¼Êø¡£ÔÚMongoDB3.2ÖÐ document validation¾ÍÊÇÓû§×Ô¶¨ÒåµÄÍêÕûÐÔÔ¼Êø£¬ÔÚ²åÈë»òÕ߸üÐÂdocuemntµÄʱºò¼ì²é£¬²»¹ýÓû§¿ÉÒÔ×ÔÐÐÉ趨validationAction£¬È·¶¨µ±Êý¾Ý²»·ûºÏÔ¼ÊøÊ±µÄ±íÏÖ£¬Ä¬ÈÏΪerror£¬¼´¾Ü¾øÊý¾Ýд²Ù×÷¡£
Òò´Ë£¬Óû§A£¬BÔÚÕâ´ÎÊÂÎñ²Ù×÷ǰºó£¬ÕË»§µÄ×ܺÍÒ»¶¨£¬ÊÇÓ¦ÓòãÃæµÄÒ»ÖÂÐÔ£¬¶ø²»ÊÇÊý¾Ý¿â±£Ö¤µÄÒ»ÖÂÐÔ£¬Ó¦ÓòãÃæµÄÒ»ÖÂÐÔÊÂʵÉÏÊÇÓÉÔ×ÓÐÔÀ´±£Ö¤µÄ¡£
¸ôÀëÐÔ˵ÆðÀ´¼òµ¥£¬µ«ÊÂʵÉϱ³ºóµÄÊÂÇéºÜ¸´ÔÓ£¬Êý¾Ý¿âµÄ¸ôÀëÐÔÒÀÀµÓÚ¼ÓËø»òÕß¶à°æ±¾¿ØÖÆ¡£¼òµ¥À´Ëµ£¬Èç¹ûUserA.account³õʼֵΪ500£¬Ö´ÐÐÍêµÚÒ»ÌõÖ¸Á¼´¼õÈ¥100£©£¬µ«ÊÂÎñ»¹Ã»ÓÐÌá½»£¬ÆäËûµÄÊÂÎñÊDz»ÄܶÁµ½Õâ¸öÖмä½á¹û£¨UserA.accountµÄֵΪ400£©µÄ¡£Õâ¾ÍÊDZÜÃâÁËÔà¶Á£¨Drity Read£©£¬¶ÔÓ¦µÄ¸ôÀë¼¶±ð¾ÍÊÇREAD_COMMITTED¡£ÔÚSQL±ê×¼ÖУ¬¶¨ÒåÁËËĸö¸ôÀë¼¶±ð£º
READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE_READ
SERIALIZABLE |
À´½â¾öÊÂÎñ²¢·¢ÖдøÀ´µÄһϼ¸¸öÎÊÌâÔà¶Á£¨Dirty Read)¡¢²»¿ÉÖØ¸´¶Á£¨Non-repeatable Read£©¡¢»Ã¶Á£¨Phantom Read£©
²»Í¬µÄÊý¾Ý¿â»òÕß˵´æ´¢ÒýÇæÄ¬ÈÏÖ§³Ö²»Í¬µÄ¸ôÀë¼¶±ð£¬±ÈÈçInnoDB´æ´¢ÒýÇæÄ¬ÈÏÖ§³ÖREPEATABLE_READ£¬¶øMongodbÖ»Ö§³ÖREAD_UNCOMMITTED
³Ö¾ÃÐÔÐèÒª¿¼Âǵ½Ò»¸öÊÂÎñÔÚÖ´Ðйý³ÌÖеĸ÷ÖÖÇé¿öµÄÒì³£¡£Ò»¸öÊÂÎñµÄÁ÷³ÌÊÇÕâÑùµÄ£º
¿ªÆôÒ»¸öÊÂÎñ
Ö´ÐÐÒ»×é²Ù×÷
Èç¹û¶¼Ö´Ðгɹ¦£¬ÄÇôÌá½»²¢½áÊøÊÂÎñ
Èç¹ûÈκβÙ×÷ʧ°Ü£¬ÄÇô»Ø¹öÒѾִÐеIJÙ×÷£¬½áÊøÊÂÎñ
ÔÚÊÂÎñÖ´Ðйý³ÌÖУ¬Èç¹û³öÏÖ¹ÊÕÏ£¬±ÈÈç¶Ïµç¡¢å´»ú£¬Õâ¸öʱºò¾ÍÒªÀûÓÃÈÕÖ¾£¨redo log»òÕßundo log£© ¼ÓÉÏ checkpointÀ´±£Ö¤ÊÂÎñµÄÍêÕû½áÊø¡£
·Ö²¼Ê½ÊÂÎñ
µ±Êý¾ÝµÄ¹æÄ£Ô½À´Ô½´ó£¬³¬³öÁ˵¥¸ö¹ØÏµÐÍÊý¾Ý¿âµÄ´¦ÀíÄÜÁ¦£¬Õâ¸öʱºò¾Í³öÏÖÁ˹ØÏµÐÍÊý¾ÝµÄ´¹Ö±·Ö±í»òÕßˮƽ·Ö±í£¬Ò²³öÏÖÁËÌìȻ֧³ÖˮƽÀ©Õ¹£¨sharding£©µÄNoSql¡£ÁíÍ⣬´óÐÍÍøÕ¾µÄ·þÎñ»¯£¨SOA£©ÒÔ¼°ÕâÁ½Äê·Ç³£»ðµÄ΢·þÎñ£¬ÍùÍù½«·þÎñ½øÐвð·Ö£¬µ¥¶À²¿Êð£¬×ÔȻҲʹÓöÀÁ¢µÄÊý¾Ý¿â£¬ÉõÖÁÊÇÒì¹¹µÄÊý¾Ý¿â¡£Õâ¸öʱºò£¬¹ØÏµÐÍÊý¾Ý¿â±£Ö¤ÊÂÎñµÄÊֶΣ¬±ÈÈç¼ÓËø¡¢ÈÕÖ¾¾ÍÐв»Í¨ÁË¡£µ±È»£¬±¾ÎÄÌÖÂ۵IJ»½ö½öÊÇÊý¾Ý¿â£¬Ò²°üº¬·Ö²¼Ê½´æ´¢¡¢ÏûÏ¢¶ÓÁУ¬ÒÔ¼°ÈκÎÒª±£Ö¤Ô×ÓÐÔ¡¢³Ö¾ÃÐÔµÄÂß¼¡£
·Ö²¼Ê½ÊÂÎñµÄ×î´óÌôÕ½ÔÚÓÚCAP£¬ÔÚ¡¶CAPÀíÂÛÓëMongoDBÒ»ÖÂÐÔ¡¢¿ÉÓÃÐÔµÄһЩ˼¿¼¡·Ò»ÎÄÖÐÓÐÏêϸ½éÉÜ¡£¼ò¶øÑÔÖ®£¬ÓÉÓÚÍøÂç·Ö¸î£¨P£º Network Partition£©µÄ´æÔÚ£¬Óû§²»µÃ²»ÔÚÒ»ÖÂÐÔ£¨C Consistency£©Óë¿ÉÓÃÐÔ£¨A£º Avaliable£©Ö®Ç°×öȨºâ¡£Èç¹ûÒª±£Ö¤Ç¿Ò»ÖÂÐÔ£¨Ö÷ÒªÊÇÓ¦ÓòãÃæµÄǿһÖÂÐÔ£©£¬ÄÇôÔÚÍøÂç·Ö¸îµÄʱºò£¬ÏµÍ³¾Í²»¿ÉÓã»Èç¹ûÒª±£Ö¤¸ß¿ÉÓÃÐÔ£¬ÄÇô¾ÍÖ»ÄÜÌṩÈõÒ»ÖÂÐÔ£¬±£Ö¤×îÖÕÒ»Ö¡£ÏÂÃæÌáµ½µÄ¸÷ÖÖʵÏÖ·Ö²¼Ê½ÊÂÎñµÄ·½·¨¡¢ÐÒé¶¼ÐèÒªÔÚÒ»ÖÂÐÔÓë¿ÉÓÃÐÔÖ®¼äȨºâ¡£
2PC
Ìáµ½·Ö²¼Ê½ÊÂÎñ£¬Ê×ÏÈÏëµ½µÄ¿Ï¶¨ÊÇÁ½½×¶ÎÌá½»£¨2pc£¬two-phase commit protocol£©£¬2pcÊǷdz£¾µäµÄǿһÖÂÐÔ¡¢ÖÐÐÄ»¯µÄÔ×ÓÌá½»ÐÒé¡£ÖÐÐÄ»¯ÊÇÖ¸ÐÒéÖÐÓÐÁ½Àà½Úµã£ºÒ»¸öÖÐÐÄ»¯Ðµ÷Õ߽ڵ㣨coordinator£©ºÍN¸ö²ÎÓëÕ߽ڵ㣨participant¡¢cohort£©¡£
¹ËÃû˼Ò壬Á½½×¶ÎÌá½»ÐÒéµÄÿһ´ÎÊÂÎñÌá½»·ÖΪÁ½¸ö½×¶Î£º
ÔÚµÚÒ»½×¶Î£¬Ðµ÷ÕßѯÎÊËùÓеIJÎÓëÕßÊÇ·ñ¿ÉÒÔÌá½»ÊÂÎñ£¨Çë²ÎÓëÕßͶƱ£©£¬ËùÓвÎÓëÕßÏòе÷ÕßͶƱ¡£
ÔÚµÚ¶þ½×¶Î£¬Ðµ÷Õ߸ù¾ÝËùÓвÎÓëÕßµÄͶƱ½á¹û×ö³öÊÇ·ñÊÂÎñ¿ÉÒÔÈ«¾ÖÌá½»µÄ¾ö¶¨£¬²¢Í¨ÖªËùÓеIJÎÓëÕßÖ´Ðиþö¶¨¡£ÔÚÒ»¸öÁ½½×¶ÎÌá½»Á÷³ÌÖУ¬²ÎÓëÕß²»Äܸıä×Ô¼ºµÄͶƱ½á¹û¡£Á½½×¶ÎÌá½»ÐÒéµÄ¿ÉÒÔÈ«¾ÖÌá½»µÄǰÌáÊÇËùÓеIJÎÓëÕß¶¼Í¬ÒâÌá½»ÊÂÎñ£¬Ö»ÒªÓÐÒ»¸ö²ÎÓëÕßͶƱѡÔñ·ÅÆú(abort)ÊÂÎñ£¬ÔòÊÂÎñ±ØÐë±»·ÅÆú¡£
wikiÉϸø³öÁ˼òÒªÁ÷³Ì£º

×¢Ò⣬ÉÏͼÖÐ×îÏÂÃæÒ»ÐÐÒ²±íÃ÷£¬Á½½×¶ÎÌá½»ÐÒéÒ²ÒÀÀµÓëÈÕÖ¾£¬Ö»Òª´æ´¢½éÖʲ»³öÎÊÌ⣬Á½½×¶ÎÐÒé¾ÍÄÜ×îÖÕ´ïµ½Ò»ÖµÄ״̬£¨³É¹¦»òÕ߻عö£©
¶øÏÂͼ£¨À´×Ôslideshare£©ÏêϸÃèÊöÁËÕû¸öÁ÷³Ì£º

ÔÚÁõ½ÜµÄ¡¶·Ö²¼Ê½ÔÀí½éÉÜÖС·£¬Óзdz£ÏêϸµÄÁ÷³Ì½éÉÜ£¬¿ÉÒÔÅäºÏÉÏͼһÆð¿´£¬ÁíÍ⻹½éÉÜÁËÔÚ¸÷ÖÖÒì³£Çé¿öÏ£¨±ÈÈçCoordinator¡¢Participantå´»ú£¬ÍøÂç·Ö¸îµ¼Öµij¬Ê±£©Á½½×¶ÎÐÒéµÄ¹¤×÷Çé¿ö¡¢¹¤×÷ЧÂÊ¡£ÁíÍ⣬ÔÚÕâÆªÎÄÕÂÖÐÒ²ÓбȽÏÇåÎúµÄÁ÷³Ì½éÉÜ¡£ÔÚÕâÀïÖ»ÌÖÂÛ2PCµÄÓÅȱµã£º
Óŵ㣺ǿһÖÂÐÔ£¬Ö»Òª½Úµã»òÕßÍøÂç×îÖÕ»Ö¸´Õý³££¬ÐÒé¾ÍÄܱ£Ö¤Ë³Àû½áÊø£»²¿·Ö¹ØÏµÐÍÊý¾Ý¿â£¨Oracle£©¡¢¿ò¼ÜÖ±½ÓÖ§³Ö
ȱµã£ºÁ½½×¶ÎÌá½»ÐÒéµÄÈÝ´íÄÜÁ¦½Ï²î£¬±ÈÈçÔÚ½Úµãå´»ú»òÕß³¬Ê±µÄÇé¿öÏ£¬ÎÞ·¨È·¶¨Á÷³ÌµÄ״̬£¬Ö»Äܲ»¶ÏÖØÊÔ£»Á½½×¶ÎÌá½»ÐÒéµÄÐÔÄܽϲ ÏûÏ¢½»»¥¶à£¬ÇÒÊÜ×îÂý½ÚµãÓ°Ïì
ÕâÆªÎÄÕÂÃèÊöÁËΪʲôÁ½½×¶ÎÌá½»ÐÒéÔÚ·Ö²¼Ê½ÏµÍ³Öв»ÊÊÓãº
ϵͳ¡°Ë®Æ½¡±ÉìËõµÄËÀµÐ¡£»ùÓÚÁ½½×¶ÎÌá½»µÄ·Ö²¼Ê½ÊÂÎñÔÚÌá½»ÊÂÎñʱÐèÒªÔÚ¶à¸ö½ÚµãÖ®¼ä½øÐÐе÷,×î´óÏ޶ȵØÍƺóÁËÌá½»ÊÂÎñµÄʱ¼äµã£¬¿Í¹ÛÉÏÑÓ³¤ÁËÊÂÎñµÄÖ´ÐÐʱ¼ä£¬Õâ»áµ¼ÖÂÊÂÎñÔÚ·ÃÎʹ²Ïí×ÊԴʱ·¢Éú³åÍ»ºÍËÀËøµÄ¸ÅÂÊÔö¸ß£¬Ëæ×ÅÊý¾Ý¿â½ÚµãµÄÔö¶à£¬ÕâÖÖÇ÷ÊÆ»áÔ½À´Ô½ÑÏÖØ£¬´Ó¶ø³ÉΪϵͳÔÚÊý¾Ý¿â²ãÃæÉÏˮƽÉìËõµÄ"¼ÏËø"£¬ ÕâÊǺܶàShardingϵͳ²»²ÉÓ÷ֲ¼Ê½ÊÂÎñµÄÖ÷ÒªÔÒò¡£
ËùÑÔÉõÊÇ£¡
3PC
Èý½×¶ÎÌá½»ÐÒ飨3pc Three-phase_commit_protocol£©Ö÷ÒªÊÇΪÁ˽â¾öÁ½½×¶ÎÌá½»ÐÒéµÄ×èÈûÎÊÌ⣬´ÓÔÀ´µÄÁ½¸ö½×¶ÎÀ©Õ¹ÎªÈý¸ö½×¶Î£¬²¢ÇÒÔö¼ÓÁ˳¬Ê±»úÖÆ¡£

3PCÖ»Êǽâ¾öÁËÔÚÒì³£Çé¿öÏÂ2PCµÄ×èÈûÎÊÌ⣬µ«µ¼ÖÂÒ»´ÎÌá½»Òª´«µÝ6ÌõÏûÏ¢£¬ÑÓʱºÜ´ó¡£¾ßÌåÁ÷³ÌÃèÊö¿É²Î¼û¡¶¹ØÓÚ·Ö²¼Ê½ÊÂÎñ¡¢Á½½×¶ÎÌá½»ÐÒé¡¢Èý½×Ìá½»ÐÒé¡·Ò»ÎÄ¡£
TCC
TCCÊÇTry¡¢Commit¡¢CancelµÄËõд£¬ÔÚ¹úÄÚÓÉÓÚÖ§¸¶±¦µÄ²¼µÀ¶ø¹ãΪÈËÖª£¬TCCÔÚ±£Ö¤Ç¿Ò»ÖÂÐÔµÄͬʱ£¬×î´óÏÞ¶ÈÌá¸ßϵͳµÄ¿ÉÉìËõÐÔÓë¿ÉÓÃÐÔ¡£
ÎÒÃǼÙÉèÒ»¸öÍêÕûµÄÒµÎñ°üº¬Ò»×é×ÓÒµÎñ£¬Try²Ù×÷Íê³ÉËùÓеÄ×ÓÒµÎñ¼ì²é£¬Ô¤Áô±ØÒªµÄÒµÎñ×ÊÔ´£¬ÊµÏÖÓëÆäËûÊÂÎñµÄ¸ôÀ룻ConfirmʹÓÃTry½×¶ÎÔ¤ÁôµÄÒµÎñ×ÊÔ´ÕæÕýÖ´ÐÐÒµÎñ£¬¶øÇÒConfirm²Ù×÷Âú×ãÃݵÈÐÔ£¬ÒÔ±éÖ§³ÖÖØÊÔ£»Cancel²Ù×÷ÊÍ·ÅTry½×¶ÎÔ¤ÁôµÄÒµÎñ×ÊÔ´£¬Í¬ÑùÒ²Âú×ãÃݵÈÐÔ¡£¡°Ò»´ÎÍêÕûµÄ½»Ò×ÓÉһϵÁÐ΢½»Ò×µÄTry ²Ù×÷×é³É£¬Èç¹ûËùÓеÄTry ²Ù×÷¶¼³É¹¦£¬×îÖÕÓÉ΢½»Ò׿ò¼ÜÀ´Í³Ò»Confirm£¬·ñÔòͳһCancel£¬´Ó¶øÊµÏÖÁËÀàËÆ¾µäÁ½½×¶ÎÌá½»ÐÒ飨2PC£©µÄǿһÖÂÐÔ¡£¡±
Óë2PCÐÒé±È½Ï £¬TCCÓµÓÐÒÔÏÂÌØµã£º
λÓÚÒµÎñ·þÎñ²ã¶ø·Ç×ÊÔ´²ã £¬ÓÉÒµÎñ²ã±£Ö¤Ô×ÓÐÔ
ûÓе¥¶ÀµÄ×¼±¸(Prepare)½×¶Î£¬½µµÍÁËÌá½»ÐÒéµÄ³É±¾
Try²Ù×÷ ¼æ±¸×ÊÔ´²Ù×÷Óë×¼±¸ÄÜÁ¦
Try²Ù×÷¿ÉÒÔÁé»îÑ¡ÔñÒµÎñ×ÊÔ´µÄËø¶¨Á£¶È£¬¶ø²»ÊÇËø×¡Õû¸ö×ÊÔ´£¬Ìá¸ßÁ˲¢·¢¶È
µ±È»£¬TCCÐèÒª½Ï¸ßµÄ¿ª·¢³É±¾£¬Ã¿¸ö×ÓÒµÎñ¶¼ÐèÒªÓÐÏìÓ¦µÄcomfirm¡¢Cancel²Ù×÷£¬¼´ÊµÏÖÏàÓ¦µÄ²¹³¥Âß¼¡£
»ùÓÚÏûÏ¢µÄ·Ö²¼Ê½ÊÂÎñ
ÕâÀàÊÂÎñ»úÖÆ½«·Ö²¼Ê½ÊÂÎñ·Ö³É¶à¸ö±¾µØÊÂÎñ£¬ÕâÀï³ÆÖ®ÎªÖ÷ÊÂÎñÓë´ÓÊÂÎñ¡£Ê×ÏÈÖ÷ÊÂÎñ±¾µØÏÈÐÐÌá½»£¬È»ºóͨ¹ýÏûϢ֪ͨ´ÓÊÂÎñ£¬´ÓÊÂÎñ´ÓÏûÏ¢ÖлñÈ¡ÐÅÏ¢½øÐб¾µØÌá½»¡£¿ÉÒÔ¿´³öÕâÊÇÒ»ÖÖÒì²½ÊÂÎñ»úÖÆ¡¢Ö»Äܱ£Ö¤×îÖÕÒ»ÖÂÐÔ£»µ«¿ÉÓÃÐԷdz£¸ß£¬²»»áÒòΪ¹ÊÕ϶ø·¢Éú×èÈû¡£ÁíÍ⣬Ö÷ÊÂÎñÒѾÏÈÐÐÌá½»£¬Èç¹ûÒòΪ´ÓÊÂÎñÎÞ·¨Ìá½»£¬Òª»Ø¹öÖ÷ÊÂÎñ»¹ÊDZȽÏÂé·³£¬ËùÒÔÕâÖÖģʽֻÊÊÓÃÓÚÀíÂÛÉÏ´ó¸ÅÂʵȳɹ¦µÄÒµÎñÇé¿ö£¬¼´´ÓÊÂÎñµÄÌύʧ°Ü¿ÉÄÜÊÇÓÉÓÚ¹ÊÕÏ£¬¶ø²»´ó¿ÉÄÜÊÇÂß¼´íÎó¡£
»ùÓÚÒì²½ÏûÏ¢µÄÊÂÎñ»úÖÆÖ÷ÒªÓÐÁ½ÖÖ·½Ê½£º±¾µØÏûÏ¢±íÓëÊÂÎñÏûÏ¢¡£¶þÕßµÄÇø±ðÔÚÓÚ£ºÔõô±£Ö¤Ö÷ÊÂÎñµÄÌá½»ÓëÏûÏ¢·¢ËÍÕâÁ½¸ö²Ù×÷µÄÔ×ÓÐÔ¡£
Èç¹ûÓÃÒì²½ÏûϢʵÏÖתÕ˵ÄÀý×Ó£¬ÄÇô²Ù×÷·ÖΪËIJ¿£ºÓû§A¿ÛÇ®£¬·¢ÏûÏ¢£¬Óû§BÊÕÏûÏ¢£¬Óû§B¿ÛÇ®¡£Ç°Á½²½±ØÐë±£Ö¤Ô×ÓÐÔ£¬Èç¹ûA¿ÛÇ®³É¹¦µ«ÊÇûÓз¢³öÏûÏ¢£¬ÄÇôÓû§AËðʧÁË£»Èç¹û·¢ÏûÏ¢³É¹¦£¬µ«ÊÇûÓпÛÇ®£¬ÄÇôÓû§B¾Í¶àµÃÁËÒ»±ÊÇ®£¬ÒøÐп϶¨²»¸É¡£
±¾µØÏûÏ¢±í
»ùÓÚ±¾µØÏûÏ¢±íµÄ·½°¸ÊÇÖ¸½«ÏûϢдÈë±¾µØÊý¾Ý¿â£¬Í¨¹ý±¾µØÊÂÎñ±£Ö¤Ö÷ÊÂÎñÓëÏûϢдÈëµÄÔ×ÓÐÔ¡£ÀýÈçÒøÐÐתÕ˵ÄÀý×Ó£¬Î±ÂëÈçÏ£º
egin transaction:
update User set account = account - 100 where userId = 'A'
insert into message(userId, amount, status) values('A', 100, 1)
commit transaction |
È»ºóͨ¹ýpull»òÕßpushģʽ£¬´ÓÒµÎñ»ñÈ¡ÏûÏ¢²¢Ö´ÐС£Èç¹ûÊÇpushģʽ£¬ÄÇôһ°ãʹÓþßÓг־û¯¹¦ÄܵÄÏûÏ¢¶ÓÁУ¬´ÓÊÂÎñÎñ¶©ÔÄÏûÏ¢¡£Èç¹ûÊÇpullģʽ£¬ÄÇô´ÓÊÂÎñ¶¨Ê±È¥ÀÈ¡ÏûÏ¢£¬È»ºóÖ´ÐС£
mongodbµÄдÈë¾ÍºÜÏñ±¾µØÏûÏ¢±í£¬ÔÚWriteConcernΪw:1µÄÇé¿öÏ£¬¸üвÙ×÷ֻҪдµ½oplogÒÔ¼°primary¾Í¿ÉÒÔÏò¿Í»§¶Ë·µ»Ø¡£secondaryÒì²½ÀÈ¡oplog²¢±¾µØ¼Ç¼ִÐС£
ÊÂÎñÏûÏ¢£º
ÊÂÎñÏûÏ¢ÒÀÀµÓÚÖ§³Ö¡°ÊÂÎñÏûÏ¢¡±µÄÏûÏ¢¶ÓÁУ¬Æä»ù±¾Ë¼ÏëÊÇ ÀûÓÃÏûÏ¢Öмä¼äʵʩÁ½½×¶ÎÌá½»£¬½«±¾µØÊÂÎñºÍ·¢ÏûÏ¢·ÅÔÚÁËÒ»¸ö·Ö²¼Ê½ÊÂÎñÀ±£Ö¤ÒªÃ´±¾µØ²Ù×÷³É¹¦³É¹¦²¢ÇÒ¶ÔÍâ·¢ÏûÏ¢³É¹¦£¬ÒªÃ´Á½Õß¶¼Ê§°Ü¡£Á÷³ÌÈçÏ£º
ÊÂÎñÏòÏûÏ¢¶ÓÁз¢ËÍÔ¤±¸ÏûÏ¢
Ö÷ÊÂÎñÊÕµ½ACKÖ®ºó±¾µØÖ´ÐÐÖ÷ÊÂÎñ
¾ÝÖ´ÐеĽá¹û£¨³É¹¦»òʧ°Ü£©ÏòÏûÏ¢¶ÓÁз¢ËÍÌá½»»òÕ߻عöÏûÏ¢
ÏêϸµÄÁ÷³ÌÈçÏÂͼ£¨Í¼Æ¬À´Ô´¼ûˮӡ£©Ëùʾ£º

²»ÄÑ¿´µ½£¬Ïà±È±¾µØÏûÏ¢±íµÄ·½Ê½£¬ÊÂÎñÏûÏ¢ÓÉÏûÏ¢Öмä¼þ±£Ö¤±¾µØÊÂÎñÓëÏûÏ¢µÄÔ×ÓÐÔ£¬²»ÒÀÀµÓÚ±¾µØÊý¾Ý¿â´æ´¢ÏûÏ¢¡£µ«ÊµÏÖÁË¡°ÊÂÎñÏûÏ¢¡±µÄÏûÏ¢¶ÓÁбȽÏÉÙ£¬»¹²»¹»Í¨Óá£
²»¹ÜÊDZ¾µØÏûÏ¢±í»¹ÊÇÊÂÎñÏûÏ¢£¬¶¼ÐèÒª±£Ö¤´ÓÊÂÎñÖ´ÐÐÇÒ½ö½öÖ´ÐÐÒ»´Î£¬exact once¡£Èç¹ûʧ°Ü£¬ÐèÒªÖØÊÔ£¬µ«Ò²²»¿ÉÄÜÎÞÏ޴εÄÖØÊÔ£¬µ±´ÓÊÂÎñ×îÖÕʧ°ÜµÄÇé¿öÏ£¬ÐèҪ֪ͨÖ÷ÒµÎñ»Ø¹öÂ𣿵«ÊÇ´Ëʱ£¬Ö÷ÊÂÎñÒѾÌá½»£¬Òò´ËÖ»ÄÜͨ¹ý²¹³¥£¬ÊµÏÖÂß¼ÉϵĻعö£¬¶øµ±Ç°Ê±¼äµã¾àÖ÷ÊÂÎñµÄÌá½»ÒѾÓÐÒ»¶¨Ê±¼ä£¬»Ø¹öÒ²¿ÉÄÜʧ°Ü¡£Òò´Ë£¬×îºÃÊDZ£Ö¤´ÓÊÂÎñÂß¼Éϲ»»áʧ°Ü£¬Íòһʧ°Ü£¬¼Ç¼log²¢±¨¾¯£¬È˹¤½éÈë¡£
1PC
1PC£¨one phase commit£©Õâ¸ö¸ÅÄÎÒÊÇÔÚ¡¶Distributed systems for fun and profit¡·Ò»ÎÄÖп´µ½µÄ£¬Ó¦¸ÃÊǶԱê2PC£¬3PC¡£ÔÚwikiÖв¢Ã»ÓÐÕýʽµÄ´ÊÌõ£¬ÔÚgoogleÉϵÄÎÄÕÂÒ²²»ÊǺܶࡣÔÚÎÒµÄÀí½âÖУ¬1PCÊÊÓÃÓÚ·Ö²¼Ê½´æ´¢ÏµÍ³µÄ¸´ÖƼ¯£¬¼´¸´ÖƼ¯Öжà¸ö½ÚµãµÄÊý¾ÝÌá½»£¬¡£Ò»°ãÀ´Ëµ£¬ÕâЩ½Úµã´æ´¢Í¬ÑùµÄÊý¾Ý£¬Ö»Òªµ¥¸ö½ÚµãÄÜÌá½»£¬ÆäËû½ÚµãÀíÂÛÉÏÒ²Ó¦¸Ã¿ÉÒÔÌá½»¡£ÔÚ¡¶Distributed systems for fun and profit¡·ÖÐÊÇÕâôÃèÊöµÄ£º
Having a second phase in place before the commit is considered permanent is useful, because it allows the system to roll back an update when a node fails. In contrast, in primary/backup ("1PC"), there is no step for rolling back an operation that has failed on some nodes and succeeded on others, and hence the replicas could diverge.
¼´¶ÔÓÚ·Ö²¼Ê½´æ´¢ÖÐʹÓ÷dz£¹ã·ºµÄÖÐÐÄ»¯¸´ÖƼ¯ÐÒéPrimary Secondary£¬ÔÚ²¿·Ö½Úµãʧ°Ü¡¢²¿·Ö½Úµã³É¹¦µÄÇé¿öÏÂûÓлعö²Ù×÷£¬¿ÉÄܻᵼÖ²»Ò»Ö¡£²»¹ýÕâЩ·Ö²¼Ê½´æ´¢ÏµÍ³¶¼½ßÁ¦±£Ö¤£¬ÕâЩ²»Ò»ÖÂÊÇÔÝʱµÄ£¬»áͨ¹ýÖØÊÔµÈÊֶα£Ö¤×îÖÕµÄÒ»Ö¡£
1PCµÄÓŵãÊÇÐÔÄܷdz£ºÃ£¬¶øÇÒÖ»ÓÐÔÚ³öÏÖÎïÀí¹ÊÕϵÄʱºò²Å»á³öÏÖ²»Ò»Ö¡£
±ÈÈçÔÚMongoDBÖУ¬¸üвÙ×÷»áдÈëPrimary½ÚµãÒÔ¼°oplog collection£¬Secondary½Úµã´ÓPrimary½ÚµãµÄoplog collectionÀÈ¡²Ù×÷ÈÕÖ¾²¢Ö´ÐУ¬ÕâÊÇÒ»¸öÒì²½µÄ¹ý³Ì¡£¼°Ê±Secondary½ÚµãÒòΪ¹ÊÕÏÖ´ÐÐoplogʧ°Ü£¬Promary½ÚµãµÄÊý¾ÝÒ²²»»á»Ø¹ö¡£ÔÚ¡¶´ø×ÅÎÊÌâѧϰ·Ö²¼Ê½ÏµÍ³Ö®ÖÐÐÄ»¯¸´ÖƼ¯¡·ÖÐÒ²Ìáµ½¹ý£¬ÎªÁËÌá¸ßÊý¾Ý¿É¿¿ÐÔ£¨±ÜÃ⼫¶ËÇé¿öÏÂÊý¾Ý±»»Ø¹ö£©£¬É趨WriteConcernΪw:Majority£¬£¨shardÓÐÒ»¸öPrimary Ò»¸öSecondary Ò»¸öArbiter×é³É£©¡£Èç¹ûÕâ¸öʱºòÓÉÓÚÆäÖÐÒ»¸ösecondary¹Òµô£¬Ð´Èë²Ù×÷ÊDz»¿ÉÄܳɹ¦µÄ¡£Òò´Ë£¬ÔÚ³¬Ê±Ê±¼äµ½´ïÖ®ºó£¬»áÏò¿Í»§¶Ë·µ»Ø³ö´íÐÅÏ¢¡£µ«ÊÇÔÚÕâ¸öʱºòÊý¾ÝÊdz־û¯µ½ÁËprimary½Úµã£¬²»»á±»»Ø¹ö¡£Èç¹û´ËʱSecondaryÖØÆô£¬ÄÇôÊÇ»á´ÓPrimaryÀÈ¡ÈÕÖ¾²¢Ö´ÐС£ËùÒÔµ±¿Í»§¶Ë·µ»ØµÄ³ö´íÐÅÏ¢°üº¬ WriteResult.writeConcernError ʱ£¬Ó¦¸Ã½÷É÷´¦Àí
¶ÔÓÚ·Ö²¼Ê½ÎļþϵͳGFS¡¢haystack£¬Èç¹ûSecondary½Úµãʧ°Ü£¬Ò²»á²ÉÈ¡¼òµ¥´Ö±©µÄÖØÊÔ£¬²¢Í¨¹ýһЩ»úÖÆ£¨cheksum£¬offset£©À´±£Ö¤×îÖÕÄܶÁµ½ÕýÈ·µÄÊý¾Ý
˼¿¼Óë×ܽá
¸ü¶àµÄʱºò£¬·Ö²¼Ê½ÊÂÎñÖ»ÐèÒª±£Ö¤Ô×ÓÐÔ£¬Õâ¸öÔ×ÓÐÔÒ²±£Ö¤ÁËÓ¦ÓòãÃæÉϵÄÒ»ÖÂÐÔ£¬¶øÓɱ¾µØÊÂÎñÀ´±£Ö¤¸ôÀëÐÔ¡¢³Ö¾ÃÐÔ¡£
Ô×ÓÐÔÕâ¸ö¶«Î÷£¬¼´Ê¹²»ÊÇ·Ö²¼Ê½£¬½ö½öÊǵ¥½ø³Ìµ¥Ïß³ÌÒ²ÊÇÐèÒª¿¼Âǵģ¬Õâ¾ÍÊÇC++ÖеÄRAII£¬pythonÖеÄwith statement£¬ÒÔ¼°¸÷ÖÖÓïÑÔµÄtry...finally...¡£µ±Éæ¼°µ½¿ç½ø³Ì¡¢Ò첽ͨÐŵÄʱºò£¬¾ÍºÜÄÑͨ¹ýÓïÑÔ²ãÃæµÄ»úÖÆ±£Ö¤Ô×ÓÐÔÁË¡£
ÔÚ·Ö²¼Ê½ÁìÓò£¬ÓÉÓÚÍøÂç»òÕß»úÆ÷¹ÊÕÏ£¬¾³£ÐèÒªÖØÊÔ£¬Òò´ËÃݵÈÐԷdz£ÖØÒª
ºÜ¶à³¡¾°£¬±ÈÈçµçÉÌ¡¢ÍøÂ繺Ʊ£¬Ê×ÏÈÒª±£Ö¤µÄÊǸ߿ÉÓ㬲»´ó¿ÉÄܲÉÓÃǿһÖÂÐÔ£¬Òò´ËÎÒÃÇÒ²»á¿´µ½¡®ÕýÔÚ´¦ÀíÖÐ...¡®ÕâÖÖÖмä״̬£¬ºǫ́ºÜ¿ÉÄÜÊÇÒì²½´¦ÀíµÄ£¬ÔÚ12306Âò¹ýƱµÄ»°¶¼ÖªµÀ£¬Ïµ¥³É¹¦µ½×îºóÊÇ·ñÄܳöƱÓɺܳ¤Ò»¶Îʱ¼ä¡£
ÔÚ±ÊÕßµÄÒµÎñÁìÓò£¬²¢Ã»ÓÐÉæ¼°µ½Ç¿Ò»ÖÂÐԵij¡¾°£¬Ö»Òª×îÖÕÒ»ÖÂÐÔ¾ÍÐÐÁË¡£ÉÏÃæµÄÌáµ½µÄ¸÷ÖÖ°ì·¨£¬²»¹ÜÊÇ2PC¡¢TCC¡¢±¾µØÏûÏ¢±í¡¢ÊÂÎñÏûÏ¢£¬¶¼ÐèÒªÒýÈë¶îÍâµÄ¿ò¼Ü»òÕß×é¼þ¡£ËùÒÔ¸ü¶àµÄʱºòÊDzÉȡҵÎñ²¹³¥µÄ·½Ê½£¬±ÈÈçÒ»¸öÉæ¼°Á½¸ö½ø³ÌµÄ²Ù×÷ÐèÒª±£Ö¤Ô×ÓÐÔ£¬½ø³Ì¼äRPCͨÐÅ£¬ÄÇôһ°ãÊÇA½ø³ÌÏÈÖ´ÐУ¬È»ºóRPCµ÷ÓÃB½ø³Ì½Ó¿Ú£¬¸ù¾ÝB½ø³ÌµÄ·µ»Ø½á¹û£¬¾ø¶ÔÊÇ·ñ»Ø¹ö£¨²¹³¥£©£»µ«Èç¹ûÉæ¼°µ½Òì²½RPC¡¢»òÕß¶àÏ̡߳¢»òÕßÁ½¸öÒÔÉϽø³ÌµÄ´®ÁªÊ±£¬ÄÇô¾Í²»Ò»¶¨Äܲ¹³¥¡¢ÉõÖÁºÜÄѲ¹³¥ÁË£¬Õâ¸öʱºòÖ»¼Ç¼һ¸öerror log£¬È»ºó֪ͨÈ˹¤ÅŲ顣Òò´Ë£¬ÊÂÎñ²¹³¥Ö»ÊʺÏÒµÎñ±È½Ï¼òµ¥µÄ³£¼û£¬¶øÇÒºÜÄÑÐγÉͨÓõĿò¼Ü£¬»òÕß˵ʵÓÃÐÔ²»Ç¿¡£
֮ǰһֱÒÔΪÏñÒøÐÐתÕËÕâÖÖ³¡¾°£¬Ò»¶¨ÊÇǿһÖÂÐԵġ£ºóÀ´×Ô¼ºÓöµ½Õâôһ»ØÊ£¬ÎÒ¸øÅóÓÑתÕË£¬ÎÒÕâ±ßÏÔʾתÕ˳ɹ¦£¬µ«ÅóÓѲ¢Ã»ÓÐÊÕµ½Ç®¡£ÎÒÒÔΪÊÇÐèÒªÒ»¶¨Ê±¼ä£¬½á¹û24Сʱ֮ºó»¹Ã»ÓÐÊÕµ½¡£ÎÒ×Ô¼ºÖØÐ±ȶÔתÕ˵¥£¬²Å·¢ÏÖÊǰѶԷ½µÄ¿ª»§ÒøÐÐд´íÁË¡£Òò´Ë¿É¼û£¬×ªÕËÕâ¸ö²Ù×÷¿Ï¶¨²»ÊÇǿһÖÂÐÔ£¬¾ßÌåÔõô¸ãµÄÔÚÍøÉÏҲûÓв鵽¡£¸ü¿ÓµùµÄÊÇ£¬×ªÕËʧ°Ü£¬ÎÒµÄÇ®±»¿ÛÁË£¬ÅóÓÑҲûÓÐÊÕµ½Ç®£¬µ«ÊÇÎÒûÓÐÊÕµ½ÈκÎÏûÏ¢£¬Ò²Ã»ÓиøÎÒ°ÑÇ®ÍË»ØÀ´£¬ÔÚÎÒ´òµç»°µ½ÒøÐÐÈ¥×Éѯ֮ºó²ÅÍË»ØÀ´¡£Õâ¸öÌåÑéÕæµÄºÜ²î£¬µ«ÒøÐÐÊÇ´óÒ¯£¬Ã»°ì·¨£¡
|