¡¸ACID ÓкܶຬÒ塹¡¢¡¸Ã¿¸öÊý¾Ý¿â¾ßÓв»Í¬µÄÒ»ÖÂÐԺ͸ôÀëÐÔ¡¹¡¢¡¸Ç¶Ì×ÊÂÎñ¿ÉÄÜÓк¦¡¹¡¡ ÕâЩ¶¼ÊǹȸèÔƹ¤³Ìʦ Jaana Dogan Ôø¾²È¹ýµÄ¿Ó¡£ÔÚÕâƪÎÄÕÂÖУ¬Ëý×ܽáÁË 17 ÌõÕâÑùµÄ¾Ñé½Ìѵ£¬Ï£ÍûΪ¸Õ½Ó´¥Êý¾Ý¿âµÄС°×Ìṩһ·Ý±Ü¿ÓÖ¸ÄÏ¡£Ä¿Ç°£¬ÕâÒ»Ö¸ÄÏÒÑÔÚ medium ÉÏÊÕ»ñÁË 5k+ ÔÞ¡£
¾ø´ó¶àÊý¼ÆËã»úϵͳ¶¼¾ßÓÐijÖÖ״̬£¬¶øÇҺܿÉÄÜ»¹ÒÀÀµÓÚÒ»¸ö´æ´¢ÏµÍ³¡£ÎÒ¶ÔÊý¾Ý¿âµÄ֪ʶҲÊÇÖð½¥ÀÛ»ýÆðÀ´µÄ£¬µ«ÔÚÀÛ»ýµÄ¹ý³ÌÖУ¬ÎÒÃǵÄÉè¼Æ´íÎóÔøµ¼Ö¹ýÊý¾Ý¶ªÊ§ºÍÖжÏÎÊÌâ¡£ÔÚÑÏÖØÒÀÀµÊý¾ÝµÄϵͳÖУ¬Êý¾Ý¿âÊÇϵͳÉè¼ÆµÄÄ¿±êºÍȨºâµÄºËÐÄ¡£¾¡¹ÜÎÒÃDz»¿ÉÄܺöÂÔÊý¾Ý¿âµÄ¹¤×÷·½Ê½£¬µ«Ó¦Óÿª·¢Õß¿ÉÒÔÔ¤¼û»òʵ¼Ê¾ÀúµÄÎÊÌâÍùÍù¶¼Ö»ÊDZùɽһ½Ç¡£ÔÚ±¾ÏµÁÐÎÄÕÂÖУ¬ÎÒ½«·ÖÏíһЩÎÒרÃÅÕÒµ½µÄ¶Ô²»Éó¤Êý¾Ý¿âÁìÓòµÄ¿ª·¢ÕߺÜÓÐÓõļû½â£º
Èç¹û 99.999% µÄʱ¼äÀïÍøÂçûÓÐÎÊÌ⣬ÄÇÄãȷʵºÜÐÒÔË¡£
ÈËÃÇÖÁ½ñÈÔÔÚÂÛ±çÈç½ñµÄÍøÂçÁ¬½Ó¼¼ÊõÓжà¿É¿¿ÒÔ¼°ÓÉÓÚÍøÂçÖж϶øµ¼ÖÂϵͳͣ»úµÄÇé¿öÓжàƵ·±¡£¿ÉÐеÄÑо¿ºÜÓÐÏÞ£¬¶øÇÒÕâЩÑо¿ÍùÍùÓÉÓµÓÐʹÓö¨ÖÆÓ²¼þµÄרÓÃÍøÂçµÄ´óÐÍ×éÖ¯ÒÔ¼°Ìض¨ÈËÔ±ËùÖ÷µ¼¡£
ƾ½è 99.999% µÄ·þÎñ¿ÉÓÃÐÔ£¬¹È¸è½ö°Ñ Spanner£¨¹È¸èÉ¢²¼ÔÚÈ«ÇòµÄÊý¾Ý¿â£©³öÏÖµÄÎÊÌâÖÐµÄ 7.6% ¹éÒòÓÚÍøÂçÁ¬½Ó£¬¾¡¹Ü¸Ã¹«Ë¾³ÆÆäרÓÃÍøÂçÊÇÕâÖÖ¿ÉÓÃÐÔ±³ºóµÄºËÐÄÔÒò¡£Bailis ºÍ Kingsbury 2014 ÄêµÄµ÷²éÏò Peter Deutsch ÓÚ 1994 ÄêÌá³öµÄ·Ö²¼Ê½¼ÆËãµÄÃýÎó£¨Fallacies of Distributed Computing£©Ö®Ò»·¢ÆðÁËÌôÕ½¡£ÍøÂçÕæµÄ¿É¿¿Âð£¿
ÎÒÃDz¢Ã»ÓÐÀ´×Ô¾ÞÍ·ÆóÒµÖ®ÍâµÄµ÷²é½á¹û»òÔÚ¹«¹²»¥ÁªÍøÉϵĵ÷²é½á¹û¡£Ö÷ÒªµçÐÅÌṩÉÌҲûÓÐ×ã¹»µÄÊý¾Ý£¬ÈÃÈËÎÞ·¨Á˽âËûÃǵĿͻ§¶ËÓöµ½µÄÎÊÌâÓжàÉÙ¿É×·Ëݵ½ÍøÂçÎÊÌâ¡£ÎÒÃdz£»áÓöµ½´óÐÍÔÆÌṩÉ̵ÄÍøÂç¶ÑÕ»ÖжϵÄÇé¿ö£¬Õâ¿ÉÄܵ¼Ö²¿·Ö»¥ÁªÍøÏÂÏß¼¸¸öСʱ£¬µ«Ö»ÓÐÓ°ÏìÁ¦ºÜ¸ßµÄʼþ²Å»áÓ°Ïìµ½´óÁ¿¿É¼û¿Í»§¶Ë¡£ÍøÂçÖжϿÉÄÜÓ°Ï췶ΧºÜ´ó£¬µ«²»ÊÇÿ¸ö°¸Àý¶¼»á²úÉúÑÏÖØÓ°Ïì¡£ÔÆ¿Í»§¶ËÒ²²»Ò»¶¨ÐèÒªÏêϸÁ˽âËûÃÇÓöµ½µÄÎÊÌâ¡£µ±³öÏÖÖжÏʱ£¬²»¿ÉÄÜʶ±ð³öÕâÊÇ·ñÊÇÓÉÌṩÉ̵¼ÖµÄÍøÂç´íÎ󡣶ÔËûÃǶøÑÔ£¬µÚÈý·½·þÎñ¶¼ÊǺÚÏä¡£Èç¹û²»ÊÇÖ÷ÒªÌṩÉÌ£¬ÊDz»¿ÉÄܹÀ¼Æ³öÓ°ÏìÓжà´óµÄ¡£
¶Ô±ÈÒ»ÏÂÖ÷ÒªÍæ¼Ò¹«²¼µÄϵͳ±¨¸æ£¬Èç¹û¿ÉÄܵ¼ÖÂÖжϵÄDZÔÚÎÊÌâÖнöÓÐһС²¿·ÖÊÇÍøÂçÎÊÌ⣬ÄÇô¿ÉÒÔ˵ÄãÊÇÏ൱ÐÒÔ˵ġ£ÍøÂçÁ¬½ÓÈÔÃæÁÙ×ÅÐí¶à³£¹æÎÊÌ⣬±ÈÈçÓ²¼þ¹ÊÕÏ¡¢ÍØÆ˱仯¡¢¹ÜÀíÅäÖøü¸ÄºÍµçÔ´¹ÊÕÏ¡£µ«ÎÒ×î½ü¿´µ½Ò»¸öÐÂÎÅ£¬·¢ÏÖöèÓã˺ҧҲÊÇÒ»¸öÏÖʵ´æÔÚµÄÎÊÌ⡪¡ªÒѾ³öÏÖ¹ýöèÓã˺ҧº£µ×¹âÀµİ¸Àý¡£
ACID ÓкܶຬÒå
ACID ±íʾÔ×ÓÐÔ£¨atomicity£©¡¢Ò»ÖÂÐÔ£¨consistency£©¡¢¸ôÀëÐÔ£¨isolation£©¡¢³Ö¾ÃÐÔ£¨durability£©¡£ACID ÊÇÊý¾Ý¿âÊÂÎñ£¨database transaction£©ÐèÒªÏòÓû§È·±£ÓÐЧµÄÊôÐÔ¡ª¡ª¼´Ê¹ÔÚ³öÏÖ±ÀÀ£¡¢´íÎó¡¢Ó²¼þ¹ÊÕϵÈÇé¿öʱҲÐèÒª±£Ö¤ÕâЩÊôÐÔ¡£Èç¹ûûÓÐ ACID »òÀàËƵı£Ö¤£¬Ó¦Óÿª·¢Õß½«ÄÑÒÔÇø·ÖËûÃÇ×Ô¼ºµÄÖ°ÔðÓëÊý¾Ý¿âÄܹ»ÌṩµÄ±£Ö¤¡£´ó¶àÊý¹ØϵÊÂÎñÊý¾Ý¿â¶¼»á¾¡Á¦·ûºÏ ACID Ö¸±ê£¬µ« NoSQL Ô˶¯µÈз½·¨´ßÉúÁËÐí¶àûÓÐ ACID ÊÂÎñµÄÊý¾Ý¿â£¬ÕâЩÕâЩÊÂÎñµÄʵÏֳɱ¾±È½Ï¸ß¡£
ÔÚÎÒ¸Õ½øÈëÕâÒ»ÐÐҵʱ£¬ÎÒÃǵļ¼ÊõÖ÷¹Üµ±Ê±ÌÖÂÛ¹ý ACID ÊÇ·ñÒÑÊÇÒ»¸ö¹ýʱµÄ¸ÅÄî¡£¿ÉÒÔºÏÀíµØ˵£¬ACID ¿ÉÊÓΪһÖÖ¶¨Òå¿íËɵÄÃèÊö£¬¶ø²»ÊÇÑϸñµÄʵÏÖ±ê×¼¡£ÏÖÈç½ñ£¬ÎÒ·¢ÏÖ ACID ×îÓÐÓõĵط½ÊÇËüÌṩÁËÎÊÌâµÄÀà±ð£¨ÒÔ¼°¿ÉÄܵĽâ¾ö·½°¸µÄÀà±ð£©¡£
²¢·Çÿ¸öÊý¾Ý¿â¶¼·ûºÏ ACID£¬¶øÔÚ·ûºÏ ACID µÄÊý¾Ý¿âÖУ¬ACID µÄ½â¶Á·½Ê½Ò²¿ÉÄܲ»Í¬¡£ÎªÊ²Ã´ ACID »áÓв»Í¬µÄʵÏÖ·½Ê½£¿Ò»¸öÔÒòÊÇÔÚʵÏÖ ACID ʱ£¬ÐèҪȨºâµÄ¶«Î÷Ì«¶àÁË¡£Êý¾Ý¿âÔÚ×ö¹ã¸æÐû´«Ê±¿ÉÄÜ»á˵×Ô¼º·ûºÏ ACID£¬µ«ÔÚÐí¶à±ßÔµ°¸ÀýÉÏÈÔ¿ÉÄÜÓв»Í¬µÄ½âÊÍ»òÔÚ´¦Àí²»Ì«¿ÉÄÜ·¢ÉúµÄʼþʱµÄ·½·¨²»Í¬¡£ÎªÁËÊʵ±µØÀí½â¹ÊÕÏģʽºÍÉè¼ÆȨºâ£¬¿ª·¢ÕßÖÁÉÙ¿ÉÒÔÔڸ߲ãÃæÉÏÁ˽âÊý¾Ý¿âʵÏÖ¸÷ÏÄܵķ½Ê½¡£
Ò»¸öÖÚËùÖÜÖªµÄÕùÒéÎÊÌâÊÇ MongoDB ÔÚµÚ 4 °æºóÓжà·ûºÏ ACID¡£MongoDB ºÜ³¤Ê±¼ä¶¼²»Ö§³ÖÈÕÖ¾¹¦ÄÜ£¬¾¡¹ÜĬÈÏÇé¿öÏÂÆäÒ²²»»á¸üƵ·±µØ£¨Ã¿ 60 Ã룩½«Êý¾ÝÎļþÌá½»µ½´ÅÅÌ¡£¿¼ÂÇÒÔÏÂÇé¿ö£¬Ò»¸öÓ¦ÓÃÖ´ÐÐÁ½´ÎдÈ루w1 ºÍ w2£©¡£MongoDB Äܹ»ÔÚµÚÒ»´ÎдÈëʱ±£Áô¸ü¸Ä£¬µ«ÎÞ·¨ÔÚдÈë w2 ʱ±£ÁôÕâÏî¸ü¸Ä£¬ÒòΪÕâ»á³öÏÖÓÉÓ²¼þ¹ÊÕÏËùÖµıÀÀ£¡£
MongoDB ÔÚдÈëÎïÀí´ÅÅÌÇ°±ÀÀ£¶øµ¼ÖÂÊý¾Ý¶ªÊ§µÄʾÒâͼ
½«Êý¾ÝÌá½»µ½´ÅÅ̵Ĺý³Ì¾ßÓнϸߵijɱ¾£¬¶øͨ¹ý±ÜÃâÌá½»£¬ËüÃÇ¿ÉÒÔÐû³ÆÔÚдÈë·½Ãæ±íÏÖ³öÉ«£¬µ«ÕâÑù¾ÍÎþÉüÁ˳־ÃÐÔ¡£Èç½ñ£¬MongoDB ÒѾÓÐÁËÈÕÖ¾¹¦ÄÜ£¬µ«Ôàд£¨dirty writes£©ÈÔÈ»¿ÉÄÜÓ°ÏìÊý¾ÝµÄ³Ö¾ÃÐÔ£¬ÒòΪËüÃÇĬÈÏÊÇÿ 100 ms Ìá½»Ò»´Î¡£¶ÔÓÚÈÕÖ¾¼°ÕâЩÈÕÖ¾Ëù±íʾµÄ¸ü¸ÄµÄ³Ö¾ÃÐÔ£¬Ò²¿ÉÄÜ»á³öÏÖͬÑùµÄÇé¿ö£¬²»¹ýÕâÖÖ·çÏÕҪСµÃ¶à¡£
ÿ¸öÊý¾Ý¿â¾ßÓв»Í¬µÄÒ»ÖÂÐԺ͸ôÀëÐÔ
ÔÚ ACID ÊôÐÔÖУ¬Ò»ÖÂÐԺ͸ôÀëÐԵIJ»Í¬ÊµÏÖϸ½ÚµÄ·¶Î§ÊÇ×î¹ãµÄ£¬ÒòΪÆäÉæ¼°µÄȨºâÒòËظü¶à¡£Ò»ÖÂÐԺ͸ôÀëÐÔ¶¼ÊÇʵÏֳɱ¾½Ï¸ßµÄÊôÐÔ¡£ÎªÁ˱£³ÖÊý¾ÝÒ»Ö£¬ËüÃÇÐèҪе÷¶øÇÒÕýµÃµ½Ô½À´Ô½¶àµÄÌÖÂÛ¡£µ±±ØÐëÒÔˮƽ·½Ê½À©Õ¹Êý¾ÝÖÐÐÄʱ£¨ÓÈÆäÊǶÔÓÚ²»Í¬µÄµØÇø£©£¬ÕâЩÎÊÌâ»á±äµÃ¸ü¼ÓÀ§ÄÑ¡£ÒòΪ´Ëʱ¿ÉÓÃÐÔ»áϽµÇÒÍøÂç·ÖÇø»áÔ½À´Ô½Æձ飬Õâ»áµ¼ÖºÜÄÑʵÏָ߲ãÃæµÄÒ»ÖÂÐÔ¡£CAP ¶¨ÀíΪÕâÒ»ÏÖÏó¸ø³öÁ˸üÆÕÊʵĽâÊÍ¡£ÐèÒªÖ¸³öµÄÊÇ£¬¼´Ê¹ÓÐһЩ²»Ò»ÖÂÐÔ£¬Ò»°ãÓ¦ÓÃÒ²ÄÜ´¦Àí£¬»òÕß³ÌÐò¿ª·¢Õ߶ÔÕâÒ»ÎÊÌâÓÐ×ã¹»µÄÈÏÖª£¬ÈÃËûÃÇÄÜΪ¸ÃÓ¦ÓÃÌí¼ÓÓÃÓÚ´¦ÀíÕâÒ»Çé¿öµÄÂß¼£¬´Ó¶øÎÞÐè¹ýÓÚÒÀÀµËûÃǵÄÊý¾Ý¿â¡£
Êý¾Ý¿âÍùÍù»áÌṩ¶àÖÖ²»Í¬µÄ¸ôÀë²ã£¬ÕâÑùÓ¦Óÿª·¢Õ߾ͿÉÒÔ»ùÓÚ×Ô¼ºµÄȨºâ²ßÂÔÀ´Ñ¡Ôñ×î¾ß³É±¾Ð§ÒæµÄ¡£µ±¸ôÀë¸üÈõʱ£¬ËٶȿÉÄܸü¿ì£¬µ«Ò²¿ÉÄܵ¼ÖÂÊý¾Ý¾ºÕù£¨data race£©¡£µ±¸ôÀë¸üǿʱ£¬²»»á³öÏÖijЩDZÔÚµÄÊý¾Ý¾ºÕù£¬µ«ËٶȻá¸üÂý£¬¶øÇÒ»¹¿ÉÄܳöÏÖÕùÓã¨contention£©Çé¿ö£¬ÕâÉõÖÁ¿ÉÄܽ«Êý¾Ý¿âµÄËÙ¶ÈÍÏÂýµ½Öжϵij̶ȡ£
ÏÖÓв¢·¢Ä£Ðͼ°ËüÃÇÖ®¼äµÄ¹Øϵ¸Å¿ö
SQL ±ê×¼½ö¶¨ÒåÁË 4 ÖÖ¸ôÀë²ã¼¶£¬µ«ÀíÂÛÉϺÍʵ¼ùÖеIJ㼶¶¼¸ü¶à¡£jepson.io ºÜºÃµØ×ܽáÁËÏÖÓв¢·¢Ä£Ð͵ÄÇé¿ö£ºhttps://jepsen.io/consistency¡£¾Ù¸öÀý×Ó£¬¹È¸èµÄ Spanner ʹÓÃÁËʱÖÓͬ²½À´±£Ö¤Íⲿ¿É´®Ðл¯£¬¼´Ê¹ÕâÊÇÒ»ÖÖ¸üÑϸñµÄ¸ôÀë²ã£¬µ«±ê×¼¸ôÀë²ãÖÐÈ´²¢Ã»ÓÐÕâÑùµÄ¶¨Òå¡£
SQL ±ê×¼ÖÐÌá¼°µÄ¸ôÀë²ã¼¶°üÀ¨£º
¿É´®Ðл¯²ã¼¶³öÏÖÊý¾Ý¾ºÕùµÄÇé¿ö×îÉÙ£¬µ«³É±¾Ò²×î¸ß£¬¶øÇÒ»áÈÃϵͳ³öÏÖ×î¶àÕùÓá£ÆäËü¸ôÀë²ã¼¶µÄ³É±¾¸üµÍһЩ£¬µ«Ò²¸ü¿ÉÄܳöÏÖÊý¾Ý¾ºÕùÎÊÌ⡣ijЩÊý¾Ý¿âÔÊÐí×ÔÐÐÉèÖøôÀë²ã¼¶£¬Ä³Ð©Êý¾Ý¿âÔòÔÚÕâ·½Ãæ¸üΪ¹ÌÖ´Ò»µã£¬²¢²»Ò»¶¨Ö§³ÖËùÓÐÕâЩ²ã¼¶¡£
¶ø¾ÍËãÊý¾Ý¿âÐû³Æ×Ô¼ºÖ§³ÖÕâЩ¸ôÀë²ã¼¶£¬µ«Ö»Òª×Ðϸ¼ì²éÒ»ÏÂËüÃǵÄÐÐΪ£¬¾Í¿ÉÒÔÁ˽âÕâЩÊý¾Ý¿âʵ¼Ê¾¿¾¹ÊÇÔõô×öµÄ¡£
ÿ¸öÊý¾Ý¿âÔÚ²»Í¬¸ôÀë²ã¼¶ÉϵIJ¢·¢Òì³£¸Å¿ö
Martin Kleppmann µÄ hermitage ÏîÄ¿×ܽáÁ˲»Í¬µÄ²¢·¢Òì³££¬²¢ËµÃ÷ÁËÒ»¸öÊý¾Ý¿âÔÚ²»Í¬µÄ¸ôÀë²ã¼¶ÉÏÄÜ·ñ´¦ÀíÕâÑùµÄÒì³££ºhttps://github.com/ept/hermitage ¡£Kleppmann µÄÑо¿±íÃ÷Êý¾Ý¿âÉè¼ÆÕß»áÒÔ²»Í¬µÄ·½Ê½½âÊ͸ôÀë²ã¼¶¡£
µ±ÄãÎÞ·¨¸ã¶¨Ëøʱ£¬¾ÍʹÓÃÀÖ¹ÛËø
ËøµÄ³É±¾·Ç³£¸ß£¬²»½öÊÇÒòΪËüÃÇ»áΪÊý¾Ý¿âÒýÈë¸ü¶àÕùÓ㬶øÇÒ»¹ÐèÒªÄãµÄÓ¦Ó÷þÎñÆ÷ÓëÊý¾Ý¿âÖ®¼ä´æÔÚÒ»ÖµÄÁ¬½Ó¡£ÍøÂç·ÖÇø¿ÉÄÜ»á¸üÏÔÖøµØÓ°ÏìÅÅËüËø£¨exclusive lock£©£¬Õâ»áµ¼ÖÂÄÑÒÔʶ±ðºÍ½â¾öµÄËÀËø£¨deadlock£©¡£Èç¹ûÓÐЩ°¸ÀýÎÞ·¨ºÜºÃµØʹÓÃÅÅËüËø£¬¿ÉÒÔÑ¡ÔñÀÖ¹ÛËø£¨optimistic locking£©¡£
ÀÖ¹ÛËøÕâÖÖ·½·¨ÊÇÖ¸µ±¶ÁȡijÐÐʱ»á¼Ç¼°æ±¾ºÅ¡¢ÉÏ´ÎÐ޸ĵÄʱ¼ä´Á»òÆäУÑéºÍ£¨checksum£©¡£È»ºóÄã¿ÉÒÔÔÚ¸ü¸Ä¼Ç¼֮ǰ¼ì²éÔ×Ó·½Ãæ²¢ÎÞÐ޸ĵİ汾¡£
UPDATE?products?SET?name?=?'Telegraph?receiver',?version?=?2?WHERE?id?=?1?AND?version?=?1?
Èç¹ûÁíÒ»Ïî¸üÐÂ֮ǰÒѾÐÞ¸ÄÁËÕâÒ»ÐУ¬ÄÇô¶Ô products ±íµÄ¸üн«Ó°Ïì 0 ÐС£Èç¹ûûÓиüÔçµÄ¸üУ¬ÔòËü»áÓ°Ïì 1 ÐУ¬ÔòÎÒÃÇ¿ÉÒÔ˵¸üгɹ¦ÁË¡£
³ýÁËÔà¶ÁºÍÊý¾Ý¶ªÊ§£¬»¹´æÔÚÆäËüÒì³£
µ±ÎÒÃÇÔÚ̽ÌÖÊý¾ÝÒ»ÖÂÐÔʱ£¬ÎÒÃÇÖ÷Òª¹Ø×¢µÄÊÇ¿ÉÄܵ¼ÖÂÔà¶ÁºÍÊý¾Ý¶ªÊ§µÄ¾ºÕùÎÊÌâ¡£µ«Êý¾Ý·½ÃæµÄÒì³£²¢²»Ö¹ÕâÁ½ÖÖ¡£
¾Ù¸öÀý×Ó£¬»¹ÓÐÒ»ÖÖÒì³£ÊÇдƫÐò£¨write skew£©¡£Ð´Æ«Ðò¸üÄÑÒÔʶ±ðÈ϶¨£¬ÒòΪÎÒÃDz»»áÖ÷¶¯µØÈ¥²éÕÒÕâ¸öÎÊÌâ¡£µ¼ÖÂдƫÐòµÄÔÒò²»ÊÇ·¢ÉúÔÚдÈëÉϵÄÔà¶Á»òÊý¾Ý¶ªÊ§£¬¶øÊÇÒòΪÊý¾ÝÉϵÄÂß¼Ô¼ÊøË𻵡£
±ÈÈ磬¼ÙÉèÒ»¸ö¼à¿ØÓ¦ÓÃÐèÒªÒ»¸öÈËÀà²Ù×÷ԱʼÖÕ´¦ÓÚ´ýÃü״̬¡£
BEGIN?tx1;??????????????????????BEGIN?tx2;SELECT?COUNT(*)?FROM?operators?WHERE?oncall?=?true;?0???????????????????????????????SELECT?COUNT(*)?????????????????????????????????FROM?operators?????????????????????????????????WHERE?oncall?=?TRUE;?????????????????????????????????0UPDATE?operators????????????????UPDATE?operators?SET?oncall?=?TRUE???????????????SET?oncall?=?TRUE?WHERE?userId?=?4;???????????????WHERE?userId?=?2;COMMIT?tx1;?????????
ÔÚÉÏÃæµÄÇé¿öÖУ¬Èç¹ûÕâЩÊÂÎñÖÐÓÐÁ½¸ö³É¹¦Ìá½»£¬¾Í»á³öÏÖдƫÐò¡£¼´Ê¹´ËʱûÓгöÏÖÔà¶Á»òÊý¾Ý¶ªÊ§£¬Êý¾ÝҲʧȥÁËÍêÕûÐÔ£¬ÒòΪÆäÖ¸¶¨ÁËÁ½¸ö´ýÃüµÄÈË¡£
¿É´®Ðл¯¸ôÀ롢ģʽÉè¼Æ»òÊý¾Ý¿âÔ¼ÊøÓÐÖúÓÚÏû³ýдƫÐò¡£¿ª·¢ÕßÐèÒªÔÚ¿ª·¢¹ý³ÌÖÐʶ±ðÕâÑùµÄÒì³££¬ÒÔ±ÜÃâÉú²ú¹ý³ÌÖгöÏÖÊý¾ÝÒì³£¡£»°ËäÈç´Ë£¬Ê¶±ð´úÂë¿âÖеÄдƫÐòÈ´·Ç³£Ö®ÄÑ¡£ÓÈÆäÊÇÔÚ´óÐÍϵͳÖУ¬Èç¹û¸ºÔð»ùÓÚͬһ±í¸ñ¹¹½¨¹¦ÄܵIJ»Í¬ÍŶÓÖ®¼äûÓйµÍ¨ÇÒûÓл¥Ïà¼ì²éËûÃÇ´æÈ¡Êý¾ÝµÄ·½Ê½£¬ÄÇô¾Í»á³öÏÖÕâÖÖÎÊÌâ¡£
ÎÒµÄÊý¾Ý¿âºÍÎÒÔÚÅÅÐò·½Ãæ²¢²»×ÜÊÇÒ»ÖµÄ
Êý¾Ý¿âÌṩµÄÒ»´óºËÐÄÄÜÁ¦ÊÇÅÅÐò±£Ö¤£¬µ«ÅÅÐò½á¹û¿ÉÄÜ»á³öºõÓ¦Óÿª·¢ÕßµÄÔ¤ÁÏ¡£Êý¾Ý¿â²éÔÄÊÂÎñµÄ˳Ðò¾ÍÊÇËüÃǽÓÊÕÕâЩÊÂÎñµÄ˳Ðò£¬¶ø²»ÊÇ¿ª·¢Õ߲鿴ËüÃÇʱµÄ³ÌÐòÉè¼Æ˳Ðò¡£ÊÂÎñÖ´ÐеÄ˳ÐòÄÑÒÔÔ¤²â£¬ÓÈÆäÊÇÔÚ¸ßÈÝÁ¿µÄ²¢·¢ÏµÍ³ÖС£
ÔÚ¿ª·¢Ê±£¬ÓÈÆäÊÇÔÚʹÓ÷Ç×èÈûÈí¼þ¿â½øÐпª·¢Ê±£¬½Ï²îµÄÑùʽºÍ¿É¶ÁÐÔ¿ÉÄܻᵼÖÂÓû§ÈÏΪÊÂÎñÊÇ°´Ë³ÐòÖ´Ðеģ¬¼´Ê¹ËüÃÇ¿ÉÄÜÒÔÈκÎ˳ÐòµÖ´ïÊý¾Ý¿â¡£ÏÂÃæµÄ³ÌÐò¿´ÆðÀ´ÏñÊÇ T1 ºÍ T2 ½«°´Ë³Ðòµ÷Ó㬵«Èç¹ûÕâЩº¯ÊýÊÇ·Ç×èÈûµÄ£¬ÔòËüÃǽ«Á¢¼´´ø×Å promise ·µ»Ø£¬µ÷ÓõÄ˳Ðò½«È¡¾öÓÚËüÃÇÔÚÊý¾Ý¿âÖнÓÊÕµ½µÄʱ¼ä¡£
result1?=?T1()?//?results?are?actually?promises?result2?=?T2()?
Èç¹ûÐèÒªÔ×ÓÐÔ£¨ÒÔ±ãÍêÈ«Ìá½»»ò·ÅÆúËùÓвÙ×÷£©ÇÒÐòÁкÜÖØÒª£¬Ôò T1 ºÍ T2 ÖеIJÙ×÷Ó¦¸ÃÔËÐÐÔÚµ¥¸öÊý¾Ý¿âÊÂÎñÖС£
Ó¦ÓòãÃæµÄ·ÖƬ¿ÉÒÔ´æÔÚÓÚ¸ÃÓ¦ÓÃÖ®Íâ
·ÖƬ£¨Sharding£©ÊÇÒ»ÖÖˮƽ»®·ÖÊý¾Ý¿âµÄ·½·¨¡£ÓеÄÊý¾Ý¿â¿ÉÒÔ×Ô¶¯µØ¶ÔÊý¾Ý½øÐÐˮƽ·ÖÇø£¬ÓеÄÊý¾Ý¿âÔò²»Ö§³ÖÕâÖÖ¹¦ÄÜ»ò×öµÃ²»ºÃ¡£µ±Êý¾Ý¼Ü¹¹Ê¦ / ¿ª·¢Õß¿ÉÒÔÔ¤²â·ÃÎÊÊý¾ÝµÄ·½Ê½Ê±£¬ËûÃÇ¿ÉÄÜ»áÔÚÓû§ÇøÓò´´½¨Ë®Æ½·ÖÇø£¬¶ø²»Êǽ«ÕâÏ×÷ίÍиøËûÃǵÄÊý¾Ý¿â¡£ÕâÖÖ·½Ê½³ÆΪӦÓü¶·ÖƬ£¨application-level sharding£©¡£
Ó¦Óü¶·ÖƬÕâ¸öÃû³ÆÍùÍù»á¸øÈË´øÀ´Ò»ÖÖ´íÎóÓ¡Ïó£¬ÈÃÈËÒÔΪÕâÖÖ·ÖƬӦ¸Ã´æÔÚÓÚÓ¦Ó÷þÎñÖ®ÖС£·ÖƬ¹¦ÄÜ¿ÉÒÔʵÏÖΪÊý¾Ý¿âµÄÇ°ÃæÒ»²ã¡£È¡¾öÓÚÊý¾ÝÔö³¤ºÍ¼Ü¹¹µü´úÇé¿ö£¬·ÖƬµÄÒªÇó¿ÉÄÜ»á±äµÃ·Ç³£¸´ÔÓ¡£Èç¹ûÄÜÔÚÎÞÐèÖØв¿ÊðÓ¦Ó÷þÎñÆ÷µÄÇ°Ìá϶ÔijЩ²ßÂÔ½øÐеü´ú£¬Ôò»á´óÓÐñÔÒæ¡£
Ó¦Ó÷þÎñÆ÷Óë·ÖƬ·þÎñ·ÖÀëµÄ¼Ü¹¹Ê¾Àý
Èç¹û½«·ÖƬ×÷Ϊһ¸öµ¥¶ÀµÄ·þÎñ£¬Äã¾ÍÄܸüºÃµØÔÚ²»ÖØв¿ÊðÓ¦Ó÷þÎñÆ÷µÄÇ°Ìáϵü´ú·ÖƬ²ßÂÔ¡£Vitess ¾ÍÊÇÓ¦Óü¶·ÖƬϵͳµÄÒ»¸öÀý×Ó¡£Vitess Ϊ MySQL ÌṩÁËˮƽ·ÖƬ£¬²¢ÔÊÐí¿Í»§¶Ëͨ¹ý MySQL ÐÒéÁ¬½ÓËü£»Vitess »á½«Êý¾Ý·ÖƬµ½¶à¸ö»¥ÏàÖ®¼äÎÞÁªÏµµÄ MySQL ½ÚµãÉÏ¡£
AUTOINCREMENT ¿ÉÄÜÓк¦
AUTOINCREMENT£¨×Ô¶¯µÝÔö£©ÊÇÉú³ÉÖ÷¼ü£¨primary key£©µÄÒ»ÖÖ³£Ó÷½·¨¡£Êý¾Ý¿â±»ÓÃ×÷ ID Éú³ÉÆ÷ÒÔ¼°Êý¾Ý¿âÖÐÓÐ ID Éú³ÉÖ¸¶¨±í¸ñµÄÇé¿öÆäʵ²¢²»ÉÙ¼û¡£µ«Ê¹ÓÃ×Ô¶¯µÝÔöÉú³ÉÖ÷¼üµÄ·½Ê½Æäʵ²¢²»ÀíÏ룬ÔÒòÓм¸µã£º
Ç뿼ÂÇ×Ô¶¯µÝÔö ID Óë UUID ¶ÔË÷Òý¡¢·ÖÇøºÍ·ÖƬµÄÓ°Ï죬ȻºóÔÙ¾ö¶¨ÄÄÖÖ·½Ê½¶ÔÄã¶øÑÔ×îºÃ¡£
¹ýʱµÄÊý¾Ý¿ÉÄÜÓÐÓöøÇÒÊÇÎÞËøµÄ
¶à°æ±¾²¢·¢¿ØÖÆ£¨MVCC£©ÄÜʵÏÖÎÒÃÇÉÏÃæ¼òÒªÌÖÂÛ¹ýµÄºÜ¶àÒ»ÖÂÐÔ¡£Postgres ºÍ Spanner µÈһЩÊý¾Ý¿âʹÓà MVCC ÒÔÈÃÿ¸öÊÂÎñ¶¼ÄÜ¿´µ½Ò»¸ö¿ìÕÕ£¬¼´¸ÃÊý¾Ý¿âµÄÒ»¸ö¸ü¾É°æ±¾¡£²ÎÕÕ¿ìÕÕµÄÊÂÎñÈÔÈ»¿ÉÒÔ´®Ðл¯ÒÔʵÏÖÒ»ÖÂÐÔ¡£µ±¶ÁÈ¡Ò»¸ö¾É¿ìÕÕʱ£¬Êµ¼Ê¶ÁÈ¡µÄÊǹýʱµÄÊý¾Ý¡£
µ«¼´Ê¹¶ÁÈ¡µÄÊÇÉÔ΢¹ýʱµÄÊý¾Ý£¬Ò²»áºÜÓÐÓô¦£¬±ÈÈçµ±ÔÚÉú³ÉÊý¾Ý·ÖÎö½á¹û»ò¼ÆËã½üËƾۺÏֵʱ¡£
¶ÁÈ¡¹ýʱÊý¾ÝµÄµÚÒ»´óÓÅÊÆÊÇÑÓ³Ù£¨ÓÈÆäÊǵ±ÄãµÄÊý¾Ý¿â·Ö²¼ÔÚ²»Í¬µÄµØÇøʱ£©¡£MVCC Êý¾Ý¿âµÄµÚ¶þ´óÓÅÊÆÊÇÆäÔÊÐíÖ»¶ÁÊÂÎñÊÇÎÞËøµÄ¡£ÔÚÐèÒª´óÁ¿¶ÁÈ¡µÄÓ¦ÓÃÖУ¬Ò»¸öÓÅÊÆÊÇÓùýʱµÄÊý¾ÝÒ²ÊÇ¿ÉÐеġ£
¼´±ã̫ƽÑóÁíÒ»¶ËÓÐij¸öÊý¾ÝµÄ×îа汾£¬µ«Ò²¿ÉÒÔ´Ó±¾µØ¶ÁÈ¡ 5 ÃëÇ°µÄ¹ýʱ¸±±¾¡£
Êý¾Ý¿â»á×Ô¶¯Çå³ý¾É°æ±¾£¬¶øÔÚijЩÇé¿öÏ£¬Êý¾Ý¿âÒ²Ö§³Ö°´ÐèÇåÀí¡£¾Ù¸öÀý×Ó£¬Postgres ÔÊÐíÓû§°´ÐèÖ´ÐÐ VACUUM ²Ù×÷»òÿ¸ôÒ»¶Îʱ¼ä×Ô¶¯Ö´ÐÐ VACUUM£¬¶ø Spanner ÔòÊÇͨ¹ýÔËÐÐÒ»¸öÀ¬»øÊÕ¼¯Æ÷À´¶ªÆúʱ¼ä³¬¹ý 1 СʱµÄ°æ±¾¡£
ÈκÎʱÖÓÔ´Ö®¼ä¶¼»á·¢ÉúʱÖÓÆ«ÒÆ
ÔÚ¼ÆËãÁìÓò£¬Òþ²ØµÃ×îºÃµÄÃØÃÜÊÇËùÓÐʱ¼ä API ¶¼ÔÚ˵»Ñ¡£ÎÒÃǵĻúÆ÷²¢²»ÄÜ׼ȷµØÖªµÀµ±Ç°µÄʱ¼äÊǶàÉÙ¡£ÎÒÃǵļÆËã»úÈ«¶¼°üº¬Ò»¸öÓÃÒÔ²úÉú¼ÆʱÐźŵÄʯӢ¾§Ìå¡£µ«Ê¯Ó¢¾§Ìå²¢²»ÄÜ׼ȷ¼ÆʱºÍ¼ÆËãʱ¼äÆ«ÒÆÁ¿£¬ÒªÃ´±Èʵ¼ÊʱÖӿ죬Ҫô¾Í¸üÂý¡£Ò»ÌìµÄÆ«ÒÆÁ¿ÉõÖÁ¿É´ï 20 Ã롣ΪÁË׼ȷ£¬ÎÒÃǵļÆËã»úʱ¼ä±ØÐ벻ʱµØÓëʵ¼Êʱ¼ä±£³Öͬ²½¡£
NTP ·þÎñÆ÷¿ÉÓÃÓÚͬ²½£¬µ«Í¬²½±¾ÉíÈ´¿ÉÄÜÓÉÓÚÍøÂçµÄÔÒò¶ø³öÏÖÑÓ³Ù¡£ÓëͬһÊý¾ÝÖÐÐÄµÄ NTP ·þÎñÆ÷ͬ²½¿öÇÒÐèҪʱ¼ä£¬Ó빫¹² NTP ·þÎñÆ÷ͬ²½¸üÊÇ¿ÉÄܲúÉú¸ü´óµÄÆ«ÒÆ¡£
Ô×ÓÖÓºÍ GPS ʱÖÓÊǸüºÃµÄÈ·¶¨µ±Ç°Ê±¼äµÄÐÅÏ¢Ô´£¬µ«ËüÃǵIJ¿Êð³É±¾¸ü¸ß£¬¶øÇÒÐèÒª¸´ÔÓµÄÉèÖ㬲»¿ÉÄÜÔÚÿ̨»úÆ÷É϶¼°²×°¡£ÓÉÓÚ´æÔÚÕâЩÏÞÖÆÌõ¼þ£¬Êý¾ÝÖÐÐÄͨ³£Ê¹ÓõÄÊǶà²ã·½·¨¡£¼´ÔÚʹÓÃÔ×ÓÖÓºÍ / »ò GPS ʱÖÓÌṩ׼ȷ¼ÆʱµÄͬʱ£¬ÔÙͨ¹ý¸¨Öú·þÎñÆ÷½«Ê±¼äÐÅÏ¢¹ã²¥¸øÆäËü»úÆ÷¡£ÕâÒâζ×ÅËùÓлúÆ÷¶¼Óëʵ¼ÊµÄµ±Ç°Ê±¼ä´æÔÚÒ»¶¨³Ì¶ÈµÄÆ«ÒÆ¡£
²»½öÈç´Ë£¬Ó¦ÓúÍÊý¾Ý¿âÍùÍù´î½¨ÔÚ²»Í¬µÄ»úÆ÷ÖУ¬ÉõÖÁ»¹¿ÉÄÜλÓÚ²»Í¬µÄÊý¾ÝÖÐÐÄ¡£Òò´Ë£¬²»½ö·ÖÉ¢ÔÚ²»Í¬»úÆ÷ÉϵIJ»Í¬Êý¾Ý¿â½ÚµãÖ®¼äÎÞ·¨Í³Ò»Ê±¼ä£¬Ó¦Ó÷þÎñÆ÷ʱÖÓºÍÊý¾Ý¿â½ÚµãʱÖÓÒ²ÎÞ·¨Í³Ò»¡£
¹È¸èµÄ TrueTime Ϊ´Ë²ÉÓÃÁËÒ»ÖÖ²»Í¬µÄ·½·¨¡£´ó¶àÊýÈËÈÏΪ¹È¸èÔÚʱÖÓÉϵijɹû¿ÉÒԹ鹦ÓÚËûÃÇʹÓÃÁËÔ×ÓÖÓºÍ GPS ʱÖÓ£¬µ«ÄÇÆäʵ½ö½öÊDz¿·ÖÔÒò¡£TrueTime ʵ¼ÊÉÏÊÇÕâÑù¹¤×÷µÄ£º
ʹÓà TrueTime µÄ Spanner ×é¼þ£¬ÆäÖÐ TT.now() »á·µ»ØÒ»¸öʱ¼äÇø¼ä£¬ÕâÑù Spanner ¾Í¿ÉÒÔ²åÈë˯Ãßʱ¼äÒÔÈ·±£µ±Ç°Ê±¼äÒѳ¬¹ýÌض¨Ê±¼ä´Á¡£
µ±µ±Ç°Ê±¼äµÄÖÃÐŶÈϽµÊ±£¬Spanner Ö´ÐвÙ×÷¿ÉÄÜ»áºÄ·Ñ¸ü¶àʱ¼ä¡£Òò´Ë£¬¼´Ê¹²»¿ÉÄÜ»ñµÃ¾«×¼µÄʱÖÓ£¬±£Ö¤Ê±ÖÓµÄÖÃÐŶȶÔÐÔÄܶøÑÔÒ²ÊǷdz£ÖØÒªµÄ¡£
ÑÓ³ÙÓкܶຬÒå
Èç¹û·¿¼äÀïÓÐ 10 ¸öÈË£¬ÄãÎÊËûÃÇ¡¸ÑÓ³Ù£¨latency£©¡¹ÊÇʲôÒâ˼£¬Äã¿ÉÄÜ»áµÃµ½ 10 ¸ö²»Í¬µÄ´ð°¸¡£ÔÚÊý¾Ý¿âÖУ¬ÑÓ³Ùͨ³£ÊÇÖ¸Êý¾Ý¿âÑÓ³Ù£¬¶ø·Ç¿Í»§¶ËËù¸ÐÖªµ½µÄÑÓ³Ù¡£¿Í»§¶Ë¸ÐÖªµ½µÄÑÓ³Ù°üº¬Êý¾Ý¿âÑÓ³ÙºÍÍøÂçÑÓ³Ù¡£ÔÚµ÷ÊÔ²»¶Ï¶ñ»¯µÄÎÊÌâʱ£¬·Ö±æ¿Í»§¶ËÑÓ³ÙºÍÊý¾Ý¿âÑÓ³ÙÊǷdz£ÖØÒªµÄ¡£ÔÚÊÕ¼¯ºÍչʾָ±êʱ£¬ÍùÍùÐèҪͬʱ°üº¬ÕâÁ½ÖÖÑÓ³Ù¡£
ÆÀ¹Àÿ¸öÊÂÎñµÄÐÔÄÜÐèÇó
ÓÐʱºò£¬Êý¾Ý¿â»á½«ËüÃǵĶÁдÍÌÍÂÁ¿ºÍÑÓ³Ù×÷ΪÐÔÄÜÓÅÊƵÄÂôµãÀ´½øÐÐÐû´«¡£¾¡¹ÜÕâÄÜÔÚÆÀ¹ÀÊý¾Ý¿âµÄÐÔÄÜʱ´Ó½Ï¸ß²ãÃæÉÏÕ¹ÏÖÖ÷ÒªµÄÏÞÖÆÒòËØ£¬µ«ÎªÁ˸üÈ«ÃæµØ½øÐÐÆÀ¹À£¬ÐèÒªµ¥¶À·Ö¿ªÆÀ¹À¸÷¸ö¹Ø¼ü²Ù×÷µÄÐÔÄÜ£¬±ÈÈçÿ´Î²éѯ»òÿ¸öÊÂÎñµÄÖ´ÐÐÐÔÄÜ¡£Ê¾Àý£º
ÆÀ¹ÀºÍʵÑé¿ÉÄÜ°üº¬ÕâÑùµÄ¹Ø¼üÐÔ°¸Àý£¬Ö±µ½ÄãÓÐÐÅÐÄÄãµÄÊý¾Ý¿âÄܹ»Âú×ãÄãµÄÐÔÄÜÐèÇó¡£ÁíÒ»¸öÀàËƵľÑé·¨ÔòÊÇÔÚÊÕ¼¯ÑÓ³ÙÖ¸±êºÍÉèÖà SLO ʱ¿¼ÂÇÕâÖÖ¹ÊÕÏÇé¿ö¡£
ÔÚÊÕ¼¯Ã¿¸ö²Ù×÷µÄÖ¸±êʱҪעÒâ¸ß»ùÊý¡£Èç¹ûÄãÐèÒª¸ß»ùÊýµÄµ÷ÊÔÊý¾Ý£¬ÇëʹÓÃÈÕÖ¾»ò·Ö²¼Ê½µÄ¸ú×Ù·½·¨¡£Èç¹ûÄãÏëÁ˽âÑÓ³Ùµ÷ÊÔ·½·¨£¬Çë²ÎÔÄ¡¶Want to Debug Latency?¡·£¨https://medium.com/observability/want-to-debug-latency-7aa48ecbe8f7£©¡£
ǶÌ×ÊÂÎñ¿ÉÄÜÓк¦
²¢·Çÿ¸öÊý¾Ý¿â¶¼Ö§³ÖǶÌ×ÊÂÎñ£¨nested transactions£©£¬µ«Èç¹ûÖ§³Ö£¬ÄÇôǶÌ×ÊÂÎñ¿ÉÄܵ¼Ö³öÈËÒâÁϵijÌÐòÉè¼Æ´íÎ󣬶øÇÒÕâÖÖ´íÎóÍùÍù²»Ò×ʶ±ð£¬Ö±µ½³öÏÖÁËÃ÷ÏÔÒì³£²ÅÄÜ¿´Çå¡£
Èç¹ûÄãÏëÒª±ÜÃâǶÌ×ÊÂÎñ£¬Ôò¿ÉÒÔʹÓÿͻ§¶ËÈí¼þ¿âÀ´¼ì²âºÍ±ÜÃâǶÌ×ÊÂÎñ¡£Èç¹ûÄã²»ÄܱÜÃâǶÌ×ÊÂÎñ£¬Ôò±ØÐë×¢Òâ²»Òª³öÏÖÒâÁÏÖ®ÍâµÄÇé¿ö£¬¼´µ±Ìá½»µÄÊÂÎñÒòΪ×ÓÊÂÎñ¶ø±»ÒâÍâÅ×Æúʱ¡£
Èç¹û½«ÊÂÎñ·â×°ÔÚ²»Í¬µÄ²ãÖУ¬¿ÉÄÜ»á³öÏÖ³öÈËÒâÁϵÄǶÌ×ÊÂÎñ°¸Àý£¬¶ø´Ó¿É¶ÁÐԽǶÈÀ´¿´£¬ÆäÒâͼ¿ÉÄܽ«±äµÃÄÑÒÔÀí½â¡£¿´¿´ÏÂÃæµÄ³ÌÐò£º
with?newTransaction():?????Accounts.create("609-543-222")????with?newTransaction():?????????Accounts.create("775-988-322")?????????throw?Rollback();?
ÒÔÉÏ´úÂëµÄ½á¹ûÊÇʲô£¿ÊÇÁ½¸öÊÂÎñ¶¼»á»Ø¹ö»¹Êǽö»Ø¹öÄÚ²¿ÄǸöÊÂÎñ£¿Èç¹ûÎÒÃǵ±Ê±ÒÀÀµµÄ¶à²ãÈí¼þ¿â½«¸ÃÊÂÎñµÄ´´½¨¹ý³Ì·â×°ÆðÀ´²»ÎªÎÒÃÇËù¼û£¬ÎÒÃÇ»¹ÄÜʶ±ðºÍ¸Ä½øÕâÑùµÄ°¸ÀýÂð£¿
¼ÙÉèÒ»¸ö¾ßÓжàÏî²Ù×÷£¨±ÈÈç newAccount£©µÄÊý¾Ý²ãÒѾÔÚËüÃÇ×Ô¼ºµÄÊÂÎñÖÐʵÏÖÁË¡£µ±ÄãÓøü¸ß²ãµÄÒµÎñÂß¼£¨ËüÃÇÔËÐÐÔÚ×Ô¼ºµÄÊÂÎñÖУ©ÔËÐÐËüÃÇʱ£¬»á·¢Éúʲô£¿¸ôÀëÐÔºÍÒ»ÖÂÐÔÓÖ»áÔõÑù£¿
function?newAccount(id?string)?{????with?newTransaction():????????Accounts.create(id)?}?
ÓëÆäºÄ·Ñ×ÊÔ´È¥½â¾öÕâЩÈÔ´ý½â¾öµÄÎÊÌ⣬»¹²»È粻ʹÓÃǶÌ×ÊÂÎñ¡£¼´Ê¹²»´´½¨ËüÃÇ×Ô¼ºµÄÊÂÎñ£¬ÄãµÄÊý¾Ý²ãÈÔ¿ÉÒÔʵÏָ߲ã²Ù×÷¡£È»ºó£¬ÒµÎñÂß¼»áÆô¶¯ÊÂÎñ£¬ÔÚÊÂÎñÉÏÔËÐвÙ×÷£¬Ìá½»»òÖÐÖ¹¡£
function?newAccount(id?string)?{?????Accounts.create(id)?}//?In?main?application:with?newTransaction():?????//?Read?some?data?from?database?for?configuration.?????//?Generate?an?ID?from?the?ID?service.?????Accounts.create(id)????Uploads.create(id)?//?create?upload?queue?for?the?user.?
? ?ÊÂÎñ²»Ó¦Î¬³ÖÓ¦ÓÃ״̬
Ó¦Óÿª·¢Õß¿ÉÄÜ»áÏëÔÚÊÂÎñÖÐʹÓÃÓ¦ÓÃ״̬À´¸üÐÂÌض¨µÄÖµ»òµ÷Õû²éѯ²ÎÊý¡£ÕâʱËùÒª¿¼ÂǵÄÒ»¸ö¹Ø¼üÊÂÏîÊÇÑ¡ÔñºÏÊʵķ¶Î§¡£¿Í»§¶ËÔÚÓöµ½ÍøÂçÎÊÌâʱÍùÍù»áÖØÊÔÊÂÎñ¡£Èç¹ûÒ»¸öÊÂÎñÒÀÀµÓÚÔÚÆäËüµØ·½»á±ä»¯µÄ״̬£¬ÄÇôÆä¿ÉÄܸù¾Ý¸ÃÎÊÌâÖÐÊý¾Ý¾ºÕùµÄ¿ÉÄÜÐÔÑ¡Ôñ´íÎóµÄÖµ¡£ÊÂÎñӦעÒâÓ¦ÓÃÖеÄÊý¾Ý¾ºÕù¡£
var?seq?int64with?newTransaction():??????newSeq?:=?atomic.Increment(&seq)??????Entries.query(newSeq)?????//?Other?operations...?
ÉÏÃæµÄÊÂÎñ²»¹Ü×îÖÕ½á¹û¾¿¾¹ÈçºÎ£¬ÔÚÿ´ÎÔËÐÐʱ¶¼»áÔö¼ÓÐòÁкš£Èç¹ûÒòΪÍøÂçÎÊÌâ¶øµ¼ÖÂÌύʧ°Ü£¬ÔòÔÚµÚ¶þ´ÎÖØÊÔʱ»áʹÓò»Í¬µÄÐòÁкŽøÐвéѯ¡£
²éѯ¼Æ»®Æ÷ÄÜÌṩÓйØÊý¾Ý¿âµÄÒ»ÇÐÐÅÏ¢
²éѯ¼Æ»®Æ÷£¨query planner£©¾ö¶¨Á˲éѯÔÚÊý¾Ý¿âÖеÄÖ´Ðз½Ê½¡£ËüÃÇ»¹»áÔÚÔËÐÐ֮ǰ·ÖÎöºÍÓÅ»¯ÕâЩ²éѯ¡£¼Æ»®Æ÷½öÄÜ»ùÓÚÆäÓµÓеÄÐźÅÌṩijЩ¿ÉÄܵĹÀ¼Æ¡£ÈçºÎÈ·¶¨ÕÒµ½ÒÔϲéѯµÄ½á¹ûµÄ·½·¨£º
SELECT?*?FROM?articles?where?author?=?"rakyll"?order?by?title;?
¼ìË÷½á¹ûµÄ·½·¨ÓÐÁ½ÖÖ£º
²éѯ¼Æ»®Æ÷µÄ×÷ÓÃÊÇÈ·¶¨ÄÄÖÖ²ßÂÔÊÇ×î¼ÑÑ¡Ôñ¡£²»¹ý¶ÔÓÚÄÄЩ¿ÉÒÔÔ¤²â£¬ÄÄЩ¿ÉÄܵ¼ÖÂÔã¸âµÄ¾ö²ß£¬²éѯ¼Æ»®Æ÷½öÓÐÓÐÏÞµÄÐźš£Êý¾Ý¿â¹ÜÀíÔ±£¨DBA£©»ò¿ª·¢Õß¿ÉʹÓÃËüÃÇÀ´Õï¶ÏºÍÓÅ»¯±íÏֽϲîµÄ²éѯ¡£µ±Êý¾Ý¿âÉý¼¶Ê±£¬Èç¹ûа汾µÄÊý¾Ý¿â³öÏÖÁËÐÔÄÜÎÊÌ⣬ÄÇôÕâ¸öÊý¾Ý¿â¿ÉÒÔµ÷½Ú²éѯ¼Æ»®Æ÷²¢½øÐÐ×ÔÎÒÕï¶Ï¡£Âý²éѯÈÕÖ¾¡¢ÑÓ³ÙÎÊÌâ»ò¹ØÓÚÖ´ÐÐʱ¼äµÄͳ¼ÆÐÅÏ¢µÈ±¨¸æ¿ÉÓÃÓÚÈ·¶¨ÐèÒªÓÅ»¯µÄ²éѯ¡£
²éѯ¼Æ»®Æ÷ÌṩµÄijЩָ±ê¿ÉÄܾßÓн϶àÔëÉù£¬ÓÈÆäÊǵ±¹À¼ÆÑÓ³Ù»ò CPU ʱ¼äʱ¡£×÷Ϊ¶Ô²éѯ¼Æ»®Æ÷µÄ²¹³ä£¬¸ú×ÙºÍÖ´Ðз¾¶¹¤¾ß¶ÔÕï¶ÏÕâЩÎÊÌâ¶øÑÔ¿ÉÄÜ»á¸ü¼ÓÓÐÓ㬲»¹ý²¢·Çÿ¸öÊý¾Ý¿â¶¼»áÌṩÕâÑùµÄ¹¤¾ß¡£
ÔÚÏßǨÒÆ¿ÉÄܸܺ´ÔÓ£¬µ«È´¿ÉÒÔʵÏÖ
ÔÚÏß»òʵʱǨÒƵÄÒâ˼ÊÇÔÚ²»Í£»úÇÒ²»Ëðº¦Êý¾ÝÕýÈ·ÐÔµÄͬʱ´ÓÒ»¸öÊý¾Ý¿âǨÒƵ½ÁíÒ»¸öÊý¾Ý¿â¡£Èç¹ûÊÇǨÒƵ½Í¬ÑùµÄÊý¾Ý¿â / ÒýÇ棬ÔÚÏßǨÒÆ»á¸üΪ¼òµ¥£»µ«Èç¹ûÊÇǨÒƵ½ÐÔÄÜÌØÐÔºÍ×éÖ¯½á¹¹ÒªÇó²»Í¬µÄÐÂÊý¾Ý¿â£¬ÄÇÇé¿ö»á¸´Ôӵöࡣ
ÔÚÏßǨÒÆÓжàÖÖģʽ£¬ÏÂÃæ½éÉÜÆäÖÐÒ»ÖÖ£º
Èç¹ûÄãÐèÒª¸ü¾ßÌåµÄ°¸Àý£¬¿ÉÒÔ¿´¿´ Stripe µÄ×ñÑÕâһģʽµÄǨÒƲßÂÔ£ºhttps://stripe.com/blog/online-migrations
Êý¾Ý¿âÏÔÖøÔö³¤Ê±»áÒýÈë²»¿ÉÔ¤²âÐÔ
Êý¾Ý¿âÔö³¤»áÈÃÄãÔâÓö²»¿ÉÔ¤²âµÄÀ©Õ¹ÎÊÌâ¡£ÎÒÃǶÔ×Ô¼ºÊý¾Ý¿âµÄÄÚ²¿Çé¿öÔ½Á˽⣬¿ÉÄܾÍÔ½ÄÑÔ¤²âËüÃǵÄÀ©Õ¹Çé¿ö£¬»¹ÓÐЩÊÂÇéÊÇÎÒÃÇÎÞ·¨Ô¤²âµÄ¡£
ÔÚÊý¾Ý¿âÔö´óʱ£¬Ö®Ç°¹ØÓÚÊý¾Ý¹æÄ£ºÍÍøÂçÈÝÁ¿ÐèÇóµÄ¼ÙÉèºÍÔ¤ÆÚ¶¼½«±äµÃ¹ýʱ¡£Õâʱºò£¬ÎªÁ˱ÜÃâÖжϣ¬ÐèÒª´ó¹æÄ£µØÖØд×éÖ¯½á¹¹¡¢´ó¹æÄ£µØ¸Ä½øÔËÓª¡¢½â¾öÈÝÁ¿ÎÊÌâ¡¢ÖØп¼ÂDz¿Êð·½°¸»òǨÒƵ½ÆäËüÊý¾Ý¿â¡£
²»ÒªÒÔΪÁ˽âÄ㵱ǰÊý¾Ý¿âµÄÄÚ²¿Çé¿ö¾ÍÍòÎÞһʧÁË£¬¹æÄ£À©´ó»¹»á´øÀ´ÐµÄδ֪¡£ÎÞ·¨Ô¤²âµÄÈȵ㡢Êý¾Ý²»Æ½ºâµÄ·Ö²¼¡¢ÒâÁÏÖ®ÍâµÄÈÝÁ¿ºÍÓ²¼þÎÊÌâ¡¢²»¶ÏÔö³¤µÄÁ÷Á¿ºÍеÄÍøÂç·ÖÇø¶¼»áÈÃÄãÖØп¼ÂÇÄãµÄÊý¾Ý¿â¡¢Êý¾ÝÄ£ÐÍ¡¢²¿ÊðÄ£ÐͺͲ¿Êð¹æÄ£¡£
ÁìȡרÊô 10ÔªÎÞÃż÷ȯ
˽Ïí×îР¼¼Êõ¸É»õ