ããŒãã 翻蚳ã: Jaana Dogan 㯠Google ã®çµéšè±å¯ãªãšã³ãžãã¢ã§ãçŸåš Go ã§æžãããå瀟ã®å®çšŒåãµãŒãã¹ã®å¯èŠ³æž¬æ§ã®éçºã«åãçµãã§ããŸãã è±èªåã®èŽè¡ã®éã§å€§ããªäººæ°ãåãããã®èšäºã§ã¯ã倧èŠæš¡ã§èŠæ±ã®å³ããã¢ããªã±ãŒã·ã§ã³ã®éçºè ãèæ ®ããã®ã«åœ¹ç«ã€ãDBMS (å Žåã«ãã£ãŠã¯åæ£ã·ã¹ãã äžè¬) ã«é¢ããéèŠãªæè¡ç詳现ã 17 é ç®ã«ãŸãšããŸããã
倧å€æ°ã®ã³ã³ãã¥ãŒã¿ ã·ã¹ãã ã¯ãã®ç¶æ
ã远跡ãããããäœããã®ããŒã¿ ã¹ãã¬ãŒãž ã·ã¹ãã ãå¿
èŠã§ãã ç§ã¯é·æéã«ããã£ãŠããŒã¿ããŒã¹ã«é¢ããç¥èãèç©ããŸãããããã®éçšã§ããŒã¿ã®æ倱ãåæ¢ã«ã€ãªããèšèšãã¹ãç¯ããŸããã 倧éã®æ
å ±ãåŠçããã·ã¹ãã ã§ã¯ãããŒã¿ããŒã¹ã¯ã·ã¹ãã ã¢ãŒããã¯ãã£ã®äžå¿ã«ãããæé©ãªãœãªã¥ãŒã·ã§ã³ãéžæããéã®éèŠãªèŠçŽ ãšããŠæ©èœããŸãã ããŒã¿ããŒã¹ã®åäœã«ã¯çŽ°å¿ã®æ³šæãæãããŠããã«ãããããããã¢ããªã±ãŒã·ã§ã³éçºè
ãäºæããããšããŠããåé¡ã¯æ°·å±±ã®äžè§ã«ãããªãããšããããããŸãã ãã®äžé£ã®èšäºã§ã¯ããã®åéãå°éãšããªãéçºè
ã«ãšã£ãŠåœ¹ç«ã€ã¢ã€ãã¢ãããã€ã玹ä»ããŸãã
- 99,999% ã®ç¢ºçã§ãããã¯ãŒã¯ãåé¡ãåŒãèµ·ãããªããã°å¹žéã§ãã
- ACID ã«ã¯ããŸããŸãªæå³ããããŸãã
- åããŒã¿ããŒã¹ã«ã¯ãäžè²«æ§ãšåé¢ã確ä¿ããããã®ç¬èªã®ã¡ã«ããºã ããããŸãã
- éåžžã®ç¶æ ãç¶æããããšãé£ããå Žåã¯ã楜芳çãªãããã¯ã圹ã«ç«ã¡ãŸãã
- ããŒã㣠ãªãŒããããŒã¿æ倱以å€ã«ãç°åžžããããŸãã
- ããŒã¿ããŒã¹ãšãŠãŒã¶ãŒã¯ãåžžã«è¡åæ¹éã«åæãããšã¯éããŸããã
- ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ã·ã£ãŒãã£ã³ã°ã¯ã¢ããªã±ãŒã·ã§ã³ã®å€ã«ç§»åã§ããŸãã
- èªåã€ã³ã¯ãªã¡ã³ãã¯å±éºãªå ŽåããããŸãã
- å€ãããŒã¿ã¯åœ¹ç«ã€å Žåããããããããã¯ããå¿ èŠã¯ãããŸããã
- æªã¿ã¯ã©ã®ãããªæéãœãŒã¹ã§ãçºçããã®ãäžè¬çã§ãã
- é 延ã«ã¯å€ãã®æå³ããããŸãã
- ããã©ãŒãã³ã¹èŠä»¶ã¯ãç¹å®ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«å¯ŸããŠè©äŸ¡ããå¿ èŠããããŸãã
- ãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ã¯å±éºãªå ŽåããããŸãã
- ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã«é¢é£ä»ããããã¹ãã§ã¯ãããŸããã
- ã¯ãšãª ãã©ã³ããŒã¯ããŒã¿ããŒã¹ã«ã€ããŠå€ãã®ããšãæããŠãããŸãã
- ãªã³ã©ã€ã³ç§»è¡ã¯å°é£ã§ãããå¯èœã§ãã
- ããŒã¿ããŒã¹ãå€§å¹ ã«å¢å ãããšãäºæž¬äžå¯èœæ§ãå¢å ããŸãã
ãã®èšäºã®ä»¥åã®ããŒãžã§ã³ã«ã€ããŠãã£ãŒãããã¯ããã ãã£ã Emmanuel Odeke æ°ãRein Henrichs æ°ããã®ä»ã®æ¹ã ã«æè¬ããããŸãã
99,999% ã®ç¢ºçã§ãããã¯ãŒã¯ãåé¡ãåŒãèµ·ãããªããã°å¹žéã§ãã
ææ°ã®ãããã¯ãŒã¯ ãã¯ãããžã®ä¿¡é Œæ§ãšããããã¯ãŒã¯é害ã«ããã·ã¹ãã ãããŠã³ããé »åºŠã«ã€ããŠã¯ãäŸç¶ãšããŠçåãæ®ããŸãã ãã®åé¡ã«é¢ããæ å ±ã¯äžè¶³ããŠãããç 究ã¯å€ãã®å Žåãå°éã®ãããã¯ãŒã¯ãæ©åšã人æãåãã倧èŠæš¡çµç¹ã«ãã£ãŠç¬å ãããŠããŸãã
Spanner (Google ã®äžççã«åæ£ãããããŒã¿ããŒã¹) ã®å¯çšæ§ç㯠99,999% ã§ãããGoogle ã¯æ¬¡ã®ããšã ãã䞻匵ããŠããŸãã
巚倧äŒæ¥ã®å€ã§ãããåºç¯ãªã€ã³ã¿ãŒãããã察象ã«å®æœãããå æ¬çãªèª¿æ»ã¯ååšããŸããã ãŸãã倧æäŒæ¥ããã¯ã顧客ã®åé¡ã®äœããŒã»ã³ãããããã¯ãŒã¯é¢é£ã§ãããã«ã€ããŠååãªããŒã¿ãåŸãããŠããŸããã ç§ãã¡ã¯ã倧èŠæš¡ãªã¯ã©ãŠã ãããã€ããŒã®ãããã¯ãŒã¯ ã¹ã¿ãã¯ã§é害ãçºçããã€ã³ã¿ãŒãããå šäœãæ°æéããŠã³ããå¯èœæ§ãããããšãããç¥ã£ãŠããŸããããã¯ãå€æ°ã®äººã ãäŒæ¥ã«åœ±é¿ãäžãã泚ç®åºŠã®é«ãã€ãã³ãã§ããããã§ãã ãããã¯ãŒã¯ã®åæ¢ã¯ããã¹ãŠã®ã±ãŒã¹ã泚ç®ãããŠããããã§ã¯ãªããšããŠããããã«å€ãã®ã±ãŒã¹ã§åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã ã¯ã©ãŠããµãŒãã¹ã®é¡§å®¢ãåé¡ã®åå ã«ã€ããŠã¯äœãç¥ããŸããã é害ãçºçããå Žåããã®åå ããµãŒãã¹ ãããã€ããŒåŽââã®ãããã¯ãŒã¯ ãšã©ãŒã§ãããšç¹å®ããããšã¯ã»ãšãã©äžå¯èœã§ãã 圌ãã«ãšã£ãŠããµãŒãããŒãã£ã®ãµãŒãã¹ã¯ãã©ãã¯ããã¯ã¹ã§ãã 倧æãµãŒãã¹ãããã€ããŒã§ãªããã°ããã®åœ±é¿ãè©äŸ¡ããããšã¯äžå¯èœã§ãã
倧æäŒæ¥ãèªç€Ÿã®ã·ã¹ãã ã«ã€ããŠå ±åããŠããå
容ãèæ
®ãããšããããã¯ãŒã¯ã®åé¡ãæœåšçãªããŠã³ã¿ã€ã ã®åé¡ã®ã»ãã®äžéšãå ããŠããã ãã§ããã°ã幞éã§ãããšèšã£ãŠãéèšã§ã¯ãããŸããã ãããã¯ãŒã¯éä¿¡ã¯äŸç¶ãšããŠãããŒããŠã§ã¢é害ãããããžãŒã®å€æŽã管çæ§æã®å€æŽãåé»ãªã©ã®æ¥åžžçãªåºæ¥äºã«æ©ãŸãããŠããŸãã æè¿ãèããããåé¡ã®ãªã¹ããè¿œå ãããããšãç¥ãé©ããŸãã
ACID ã«ã¯ããŸããŸãªæå³ããããŸã
ACID ã¯ãAtomicityãConsistencyãIsolationãReliability ã®é åèªã§ãã ãã©ã³ã¶ã¯ã·ã§ã³ã®ãããã®ããããã£ã¯ãé害ããšã©ãŒãããŒããŠã§ã¢é害ãªã©ãçºçããå Žåã«ãã©ã³ã¶ã¯ã·ã§ã³ã®æå¹æ§ãä¿èšŒããããšãç®çãšããŠããŸãã ACID ãŸãã¯åæ§ã®ã¹ããŒã ããªããã°ãã¢ããªã±ãŒã·ã§ã³éçºè ãèªåã®è²¬ä»»ãšããŒã¿ããŒã¹ã®è²¬ä»»ãåºå¥ããããšãå°é£ã«ãªããŸãã ã»ãšãã©ã®ãªã¬ãŒã·ã§ãã« ãã©ã³ã¶ã¯ã·ã§ã³ ããŒã¿ããŒã¹ã¯ ACID ã«æºæ ããããšããŠããŸãããå®è£ ã«ã³ã¹ããããããããNoSQL ã®ãããªæ°ããã¢ãããŒãã«ãããACID ãã©ã³ã¶ã¯ã·ã§ã³ã®ãªãå€ãã®ããŒã¿ããŒã¹ãèªçããŸããã
ç§ãåããŠãã®æ¥çã«å ¥ã£ããšããåœç€Ÿã®æè¡è²¬ä»»è ã¯ãACID ã®æŠå¿µãããã«é©åã§ãããã«ã€ããŠè©±ããŠããŸããã å ¬å¹³ãæãããã«èšããšãACID ã¯å³å¯ãªå®è£ æšæºã§ã¯ãªãã倧ãŸããªèª¬æã§ãããšèããããŠããŸãã çŸåšã§ã¯ãç¹å®ã®ã«ããŽãªã®åé¡ãæèµ·ããã (ãããŠèããããããŸããŸãªè§£æ±ºçãææ¡ããã) ããããããéåžžã«åœ¹ç«ã€ãšæããŠããŸãã
ãã¹ãŠã® DBMS ã ACID ã«æºæ ããŠããããã§ã¯ãããŸããã åæã«ãACID ããµããŒãããããŒã¿ããŒã¹å®è£ ã¯ãäžé£ã®èŠä»¶ãç°ãªãæ¹æ³ã§ç解ããŸãã ACID å®è£ ã«ãããããçç±ã® XNUMX ã€ã¯ãACID èŠä»¶ãå®è£ ããããã«å€ãã®ãã¬ãŒããªããè¡ãå¿ èŠãããããã§ãã äœæè ã¯ããŒã¿ããŒã¹ã ACID æºæ ãšããŠæ瀺ãããããããŸãããããããããããªããã€ãã³ããåŠçããã¡ã«ããºã ãšåæ§ã«ããšããž ã±ãŒã¹ã®è§£éã¯å€§å¹ ã«ç°ãªãå¯èœæ§ããããŸãã å°ãªããšããéçºè ã¯åºæ¬å®è£ ã®è€éããé«ã¬ãã«ã§ç解ãããã®ç¹æ®ãªåäœãšèšèšã®ãã¬ãŒããªããé©åã«ç解ããããšãã§ããŸãã
MongoDB ã ACID èŠä»¶ã«æºæ ããŠãããã©ããã«é¢ããè°è«ã¯ãããŒãžã§ã³ 4 ã®ãªãªãŒã¹åŸãç¶ããŠããŸãã MongoDB ã¯é·ãéãµããŒããããŠããŸããã§ãã
ã·ããªãªã瀺ãå³ã MongoDB ãããŒã¿ããã£ã¹ã¯ã«æžã蟌ãåã«ã¯ã©ãã·ã¥ãã
ãã£ã¹ã¯ãžã®ã³ãããã¯ã³ã¹ãã®ãããããã»ã¹ã§ãã é »ç¹ãªã³ããããé¿ããããšã§ãéçºè ã¯ä¿¡é Œæ§ãç ç²ã«ããŠèšé²ããã©ãŒãã³ã¹ãåäžãããŸãã MongoDB ã¯çŸåšãã°ããµããŒãããŠããŸãããããã©ã«ãã§ã¯ãã°ã 100 ããªç§ããšã«ãã£ããã£ããããããããŒã㣠ã©ã€ãã¯äŸç¶ãšããŠããŒã¿ã®æŽåæ§ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã ã€ãŸãããªã¹ã¯ã¯ã¯ããã«äœããªããŸããããã°ãšããã«ç€ºãããå€æŽã«ã€ããŠãåæ§ã®ã·ããªãªãçºçããå¯èœæ§ããããŸãã
åããŒã¿ããŒã¹ã«ã¯ç¬èªã®äžè²«æ§ãšåé¢ã®ã¡ã«ããºã ããããŸãã
ACID èŠä»¶ã®äžã§ãäžè²«æ§ãšåé¢ã¯ããã¬ãŒããªãã®ç¯å²ãåºããããæãå€ãã®ç°ãªãå®è£
ãèªããŸãã äžè²«æ§ãšåé¢ã¯éåžžã«é«äŸ¡ãªæ©èœã§ãããšèšããªããã°ãªããŸããã ãããã«ã¯èª¿æŽãå¿
èŠã§ãããããŒã¿ã®äžè²«æ§ãæ±ãã競äºãæ¿åããŸãã è€æ°ã®ããŒã¿ã»ã³ã¿ãŒã«ããã£ãŠããŒã¿ããŒã¹ãæ°Žå¹³ã«æ¡åŒµããå¿
èŠãããå Žå (ç¹ã«ããŒã¿ã»ã³ã¿ãŒãå°ççã«ç°ãªãå°åã«ããå Žå)ãåé¡ã®è€éãã¯å€§å¹
ã«å¢å ããŸãã é«ã¬ãã«ã®äžè²«æ§ãéæããããšã¯ãå¯çšæ§ãäœäžãããããã¯ãŒã¯ã®ã»ã°ã¡ã³ãåãå¢å ãããããéåžžã«å°é£ã§ãã ãã®çŸè±¡ã®ããäžè¬çãªèª¬æã«ã€ããŠã¯ã以äžãåç
§ããããšããå§ãããŸãã
DBMS ã¯å€ãã®å ŽåãããŸããŸãªã¬ãã«ã®åé¢ãæäŸããŸãã ã¢ããªã±ãŒã·ã§ã³éçºè ã¯ã奜ã¿ã«åºã¥ããŠæãå¹æçãªãã®ãéžæã§ããŸãã åé¢æ§ãäœããšé床ã¯åäžããŸãããããŒã¿ç«¶åã®ãªã¹ã¯ãé«ãŸããŸãã æç±æ§ãé«ããšãã®å¯èœæ§ã¯äœããªããŸãããäœæ¥ãé ããªãã競äºãçºçããå¯èœæ§ããããåºç€ã«ãã¬ãŒããããããæ éãå§ãŸããŸãã
æ¢åã®åæå®è¡ã¢ãã«ãšãããã®éã®é¢ä¿ã®ã¬ãã¥ãŒ
SQL æšæºã§ã¯ XNUMX ã€ã®åé¢ã¬ãã«ã®ã¿ãå®çŸ©ãããŠããŸãããçè«äžããã³å®éã«ã¯ããã«å€ãã®åé¢ã¬ãã«ããããŸãã
SQL æšæºã§ã¯ã次ã®åé¢ã¬ãã«ã«ã€ããŠèšåããŠããŸãã
- ã·ãªã¢ã©ã€ã¶ãã« (æãå³æ Œã§é«äŸ¡): çŽååå¯èœãªå®è¡ã«ã¯ãäžéšã®é次ãã©ã³ã¶ã¯ã·ã§ã³ã®å®è¡ãšåãå¹æããããŸãã é 次å®è¡ãšã¯ãåã®ãã©ã³ã¶ã¯ã·ã§ã³ãå®äºããåŸã§ã®ã¿åŸç¶ã®ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ãããããšãæå³ããŸãã 泚æãã¹ãã¬ãã«ã¯ã ã·ãªã¢ã©ã€ã¶ãã« ã¹ãããã·ã§ããåé¢èªäœã¯ SQL æšæºã§ã¯è¡šçŸãããŠããŸãããã解éã®éãã«ãããããããã¹ãããã·ã§ããåé¢ (Oracle ãªã©) ãšããŠå®è£ ãããããšããããããŸãã
- å埩å¯èœãªèªã¿åã: çŸåšã®ãã©ã³ã¶ã¯ã·ã§ã³å
ã®ã³ããããããŠããªãã¬ã³ãŒãã¯çŸåšã®ãã©ã³ã¶ã¯ã·ã§ã³ã§äœ¿çšã§ããŸãããä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ãã£ãŠè¡ãããå€æŽ (æ°ããè¡ãªã©)
èŠããªã . - èªã¿åããã³ããããããŸãã: ã³ããããããŠããªãããŒã¿ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã«äœ¿çšã§ããŸããã ãã®å Žåããã©ã³ã¶ã¯ã·ã§ã³ã¯ã³ããããããããŒã¿ã®ã¿ãåç §ã§ãããã¡ã³ãã èªã¿åããçºçããå¯èœæ§ããããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ãæ°ããè¡ãæ¿å ¥ããŠã³ããããããšãçŸåšã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ã¯ãšãªæã«ãããã®è¡ã確èªã§ããããã«ãªããŸãã
- ã³ããããããŠããªãèªã¿åã (æãå³å¯ã§ã³ã¹ããäœãã¬ãã«): ããŒãã£èªã¿åããèš±å¯ããããã©ã³ã¶ã¯ã·ã§ã³ã¯ä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ãã£ãŠè¡ãããã³ããããããŠããªãå€æŽã確èªã§ããŸãã å®éã«ã¯ããã®ã¬ãã«ã¯ã¯ãšãªãªã©ã®å€§ãŸããªèŠç©ããã«åœ¹ç«ã€å ŽåããããŸãã
COUNT(*)
ããŒãã«ã®äžã«ã
УÑÐŸÐ²ÐµÐœÑ ã·ãªã¢ã©ã€ã¶ãã« ããŒã¿ç«¶åã®ãªã¹ã¯ãæå°éã«æããããšãã§ããŸãããå®è£ ã«æãè²»çšãããããã·ã¹ãã ã«å¯Ÿãã競äºè² è·ãæãé«ããªããŸãã ä»ã®åé¢ã¬ãã«ã¯å®è£ ãç°¡åã§ãããããŒã¿ç«¶åã®å¯èœæ§ãé«ããªããŸãã ã«ã¹ã¿ã åé¢ã¬ãã«ãèšå®ã§ãã DBMS ãããã°ã匷åãªèšå®ãããããã¹ãŠã®ã¬ãã«ããµããŒããããŠããããã§ã¯ãªã DBMS ããããŸãã
ç¹å®ã® DBMS ã§ã¯åé¢ã¬ãã«ã®ãµããŒãã宣äŒãããããšããããããŸãããå®éã«äœãèµ·ãã£ãŠããããæããã«ããã«ã¯ããã®åäœã泚ææ·±ã調æ»ããå¿ èŠããããŸãã
ããŸããŸãª DBMS ã®ããŸããŸãªåé¢ã¬ãã«ã§ã®åæå®è¡ç°åžžã®ã¬ãã¥ãŒ
ããŒãã£ã³ã»ã¯ã¬ãããã³ã®ãããžã§ã¯ã
éåžžã®ç¶æ ãç¶æããããšãé£ããå Žåã¯ã楜芳çãªãããã¯ã圹ã«ç«ã¡ãŸãã
ããããã³ã°ã¯ãããŒã¿ããŒã¹å ã§ã®ç«¶åãå¢ããã ãã§ãªããã¢ããªã±ãŒã·ã§ã³ ãµãŒããŒãããŒã¿ããŒã¹ã«åžžææ¥ç¶ããå¿ èŠããããããéåžžã«ã³ã¹ãããããå¯èœæ§ããããŸãã ãããã¯ãŒã¯ã®ã»ã°ã¡ã³ãåã«ãããæä»çããã¯ã®ç¶æ³ãæªåããŠãç¹å®ãšè§£æ±ºãå°é£ãªãããããã¯ãçºçããå¯èœæ§ããããŸãã æä»çããã¯ãé©åã§ãªãå Žåã«ã¯ã楜芳çããã¯ã圹ã«ç«ã¡ãŸãã
UPDATE products
SET name = 'Telegraph receiver', version = 2
WHERE id = 1 AND version = 1
ãã®å ŽåãããŒãã«ãæŽæ°ãããšã products
以åã«å¥ã®æäœããã®è¡ã«å€æŽãå ããå Žåãå®è¡ãããŸããã ãã®è¡ã«å¯ŸããŠä»ã®æäœãå®è¡ãããªãã£ãå ŽåãXNUMX è¡ã®å€æŽãçºçããæŽæ°ãæåãããšèšããŸãã
ããŒãã£ãªãŒããããŒã¿æ倱以å€ã«ãç°åžžããã
ããŒã¿ã®äžè²«æ§ã«é¢ããŠã¯ãããŒã㣠ãªãŒããããŒã¿æ倱ã«ã€ãªããå¯èœæ§ã®ãã競åç¶æ ã®å¯èœæ§ã«çŠç¹ãåœãŠãããŸãã ãã ããããŒã¿ã®ç°åžžã¯ããã ãã§ã¯ãããŸããã
ãã®ãããªç°åžžã®äžäŸã¯ãé²é³ã®æªã¿ã§ãã (ã¹ãã¥ãŒãæžã)ã æªã¿ã¯éåžžç©æ¥µçã«æ¢ãããããšããªããããæ€åºããã®ãå°é£ã§ãã ãããã¯ããŒã㣠ãªãŒããããŒã¿æ倱ã«ãããã®ã§ã¯ãªããããŒã¿ã«èª²ãããè«çå¶çŽã®éåã«ãããã®ã§ãã
ããšãã°ãXNUMX 人ã®ãªãã¬ãŒã¿ãŒãåžžã«ãªã³ã³ãŒã«ã§ããå¿ èŠãããç£èŠã¢ããªã±ãŒã·ã§ã³ãèããŠã¿ãŸãããã
BEGIN tx1; BEGIN tx2;
SELECT COUNT(*)
FROM operators
WHERE oncall = true;
0 SELECT COUNT(*)
FROM operators
WHERE oncall = TRUE;
0
UPDATE operators UPDATE operators
SET oncall = TRUE SET oncall = TRUE
WHERE userId = 4; WHERE userId = 2;
COMMIT tx1; COMMIT tx2;
äžèšã®ç¶æ³ã§ã¯ãäž¡æ¹ã®ãã©ã³ã¶ã¯ã·ã§ã³ãæ£åžžã«ã³ããããããå Žåãã¬ã³ãŒãã®ç ŽæãçºçããŸãã ããŒã㣠ãªãŒããããŒã¿æ倱ã¯ãããŸããã§ããããããŒã¿ã®æŽåæ§ãæãªãããŸãããçŸåšãXNUMX 人ãåæã«ãªã³ã³ãŒã«ãšã¿ãªãããŸãã
ã·ãªã¢ã«åå¯èœãªåé¢ãã¹ããŒãèšèšããŸãã¯ããŒã¿ããŒã¹å¶çŽã¯ãæžã蟌ã¿ç Žæã®æé€ã«åœ¹ç«ã¡ãŸãã éçºè ã¯ãå®çšŒåç°å¢ã§ã®ç°åžžãåé¿ããããã«ãéçºäžã«ãã®ãããªç°åžžãç¹å®ã§ããªããã°ãªããŸããã åæã«ãã³ãŒãããŒã¹ã§é²é³ã®æªã¿ãæ¢ãã®ã¯éåžžã«å°é£ã§ãã ç¹ã«å€§èŠæš¡ã·ã¹ãã ã§ã¯ãç°ãªãéçºããŒã ãåãããŒãã«ã«åºã¥ããæ©èœã®å®è£ ãæ åœããŠãããããŒã¿ ã¢ã¯ã»ã¹ã®è©³çŽ°ã«ã€ããŠåæããŠããªãå Žåã«çºçããŸãã
ããŒã¿ããŒã¹ãšãŠãŒã¶ãŒã¯äœããã¹ããã«ã€ããŠåžžã«åæãããšã¯éããŸãã
ããŒã¿ããŒã¹ã®éèŠãªæ©èœã® XNUMX ã€ã¯å®è¡é åºã®ä¿èšŒã§ããããã®é åºèªäœã¯ãœãããŠã§ã¢éçºè ã«ãšã£ãŠééçã§ã¯ãªãå ŽåããããŸãã ããŒã¿ããŒã¹ã¯ãããã°ã©ããæå³ããé åºã§ã¯ãªããåä¿¡ããé åºã§ãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ã®é åºãäºæž¬ããããšã¯ãç¹ã«é«è² è·ã®äžŠåã·ã¹ãã ã§ã¯å°é£ã§ãã
éçºäžãç¹ã«ãã³ããããã³ã° ã©ã€ãã©ãªã䜿çšããå Žåãã¹ã¿ã€ã«ãæªãå¯èªæ§ãäœããããå®éã«ã¯ãã©ã³ã¶ã¯ã·ã§ã³ã¯ä»»æã®é åºã§ããŒã¿ããŒã¹ã«å°çããå¯èœæ§ãããã«ããããããããŠãŒã¶ãŒã¯ãã©ã³ã¶ã¯ã·ã§ã³ãé çªã«å®è¡ããããšä¿¡ããŠããŸãå¯èœæ§ããããŸãã
äžèŠãããšã以äžã®ããã°ã©ã ã§ã¯ T1 ãš T2 ãé çªã«åŒã³åºãããŠããŸããããããã®é¢æ°ããã³ããããã³ã°ã§ãããããã«æ¬¡ã®åœ¢åŒã§çµæãè¿ããŸãã
result1 = T1() // å®éã®çµæã¯çŽæã§ã
çµæ 2 = T2()
ã¢ãããã¯æ§ãå¿ èŠã§ (ã€ãŸãããã¹ãŠã®æäœãå®äºãããäžæ¢ããå¿ èŠããã)ãé åºãéèŠãªå Žåã¯ãæäœ T1 ãš T2 ã XNUMX ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³å ã§å®è¡ããå¿ èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ã·ã£ãŒãã£ã³ã°ã¯ã¢ããªã±ãŒã·ã§ã³ã®å€ã«ç§»åå¯èœ
ã·ã£ãŒãã£ã³ã°ã¯ãããŒã¿ããŒã¹ãæ°Žå¹³ã«åå²ããæ¹æ³ã§ãã ããŒã¿ãèªåçã«æ°Žå¹³åå²ã§ããããŒã¿ããŒã¹ãããã°ããããã§ããªãããŸãã¯ããŸãåŸæã§ãªãããŒã¿ããŒã¹ããããŸãã ããŒã¿ ã¢ãŒããã¯ã/éçºè ã¯ãããŒã¿ãã©ã®ããã«ã¢ã¯ã»ã¹ãããããæ£ç¢ºã«äºæž¬ã§ããå Žåããã®äœæ¥ãããŒã¿ããŒã¹ã«å§ä»»ãã代ããã«ããŠãŒã¶ãŒç©ºéã«æ°Žå¹³ããŒãã£ã·ã§ã³ãäœæã§ããŸãã ãã®ããã»ã¹ã¯ãã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ã·ã£ãŒãã£ã³ã°ããšåŒã°ããŸãã (ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ã·ã£ãŒãã£ã³ã°).
æ®å¿µãªããããã®ååã«ãããã·ã£ãŒãã£ã³ã°ãã¢ããªã±ãŒã·ã§ã³ ãµãŒãã¹ã«ååšãããšãã誀解ãçããããšããããããŸãã å®éãããŒã¿ããŒã¹ã®åã«å¥ã®ã¬ã€ã€ãŒãšããŠå®è£ ã§ããŸãã ããŒã¿ã®å¢å ãšã¹ããŒãã®å埩ã«ãã£ãŠã¯ãã·ã£ãŒãã£ã³ã°èŠä»¶ãéåžžã«è€éã«ãªãå¯èœæ§ããããŸãã äžéšã®æŠç¥ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ ãµãŒããŒãåãããã€ããããšãªãå埩ã§ããæ©èœããã¡ãªãããåŸãããå ŽåããããŸãã
ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãšã·ã£ãŒãã£ã³ã°ãµãŒãã¹ãåé¢ããã¢ãŒããã¯ãã£ã®äŸ
ã·ã£ãŒãã£ã³ã°ãå¥ã®ãµãŒãã¹ã«ç§»è¡ãããšãã¢ããªã±ãŒã·ã§ã³ãåãããã€ããå¿
èŠãªããããŸããŸãªã·ã£ãŒãã£ã³ã°æŠç¥ã䜿çšã§ããæ©èœãæ¡åŒµãããŸãã
èªåã€ã³ã¯ãªã¡ã³ãã¯å±éºãªå¯èœæ§ããããŸã
AUTOINCREMENT ã¯äž»ããŒãçæããäžè¬çãªæ¹æ³ã§ãã ããŒã¿ããŒã¹ã ID ãžã§ãã¬ãŒã¿ãŒãšããŠäœ¿çšããããã®ããŒã¿ããŒã¹ã«èå¥åãçæããããã«èšèšãããããŒãã«ãå«ãŸããå ŽåããããããŸãã èªåã€ã³ã¯ãªã¡ã³ãã䜿çšããŠäž»ããŒãçæããããšãçæ³ããçšé ãçç±ã¯ããã€ããããŸãã
- åæ£ããŒã¿ããŒã¹ã§ã¯ãèªåã€ã³ã¯ãªã¡ã³ãã¯æ·±å»ãªåé¡ã§ãã ID ãçæããã«ã¯ãã°ããŒãã« ããã¯ãå¿ èŠã§ãã 代ããã«ãUUID ãçæã§ããŸããããã«ã¯ãç°ãªãããŒã¿ããŒã¹ ããŒãéã®å¯Ÿè©±ã¯å¿ èŠãããŸããã ããã¯ã䜿çšããèªåã€ã³ã¯ãªã¡ã³ãã¯ç«¶åãåŒãèµ·ãããåæ£ç¶æ³ã§ã®æ¿å ¥ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžãããå¯èœæ§ããããŸãã äžéšã® DBMS (MySQL ãªã©) ã§ã¯ããã¹ã¿ãŒéã¬ããªã±ãŒã·ã§ã³ãé©åã«æ§æããããã«ãç¹å¥ãªæ§æãšãã现å¿ã®æ³šæãå¿ èŠãªå ŽåããããŸãã ãŸããèšå®æã«ééããç¯ãããããèšé²ã®å€±æã«ã€ãªãããŸãã
- äžéšã®ããŒã¿ããŒã¹ã«ã¯ãäž»ããŒã«åºã¥ããããŒãã£ã·ã§ã³åã¢ã«ãŽãªãºã ããããŸãã ID ãé£ç¶ãããšãäºæž¬ã§ããªãããã ã¹ããããçºçããäžéšã®ããŒãã£ã·ã§ã³ã§è² è·ãå¢å ããäžæ¹ãä»ã®ããŒãã£ã·ã§ã³ã¯ã¢ã€ãã«ç¶æ ã®ãŸãŸã«ãªãå¯èœæ§ããããŸãã
- äž»ããŒã¯ãããŒã¿ããŒã¹å ã®è¡ã«ã¢ã¯ã»ã¹ããæãéãæ¹æ³ã§ãã ã¬ã³ãŒããèå¥ããããã®ããè¯ãæ¹æ³ã«ãããã·ãŒã±ã³ã·ã£ã« ID ã䜿çšãããšãããŒãã«å ã®æãéèŠãªåãæå³ã®ãªãå€ã§æºãããã圹ã«ç«ããªãåã«å€ããå¯èœæ§ããããŸãã ãããã£ãŠãå¯èœãªéããã°ããŒãã«ã«äžæã§èªç¶ãªäž»ã㌠(ãŠãŒã¶ãŒåãªã©) ãéžæããŠãã ããã
ã¢ãããŒãã決å®ããåã«ãèªåã€ã³ã¯ãªã¡ã³ã ID ãš UUID ãã€ã³ããã¯ã¹äœæãããŒãã£ã·ã§ãã³ã°ãã·ã£ãŒãã£ã³ã°ã«äžãã圱é¿ãèæ ®ããŠãã ããã
å€ãããŒã¿ã¯åœ¹ç«ã€å Žåããããããã¯ããå¿ èŠã¯ãããŸãã
ãã«ãããŒãžã§ã³åæå®è¡å¶åŸ¡ (MVCC) ã¯ãäžã§ç°¡åã«èª¬æããäžè²«æ§èŠä»¶ã®å€ããå®è£ ããŸãã äžéšã®ããŒã¿ããŒã¹ (PostgresãSpanner ãªã©) ã¯ãMVCC ã䜿çšããŠãããŒã¿ããŒã¹ã®å€ãããŒãžã§ã³ã§ããã¹ãããã·ã§ããããã©ã³ã¶ã¯ã·ã§ã³ã«ããã£ãŒããããŸãã ã¹ãããã·ã§ãã ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãäžè²«æ§ã確ä¿ããããã«ã·ãªã¢ã«åããããšãã§ããŸãã å€ãã¹ãããã·ã§ããããèªã¿åããšãå€ãããŒã¿ãèªã¿åãããŸãã
ãããã«å€ãããŒã¿ãèªã¿åããšãããŒã¿ããåæãçæããããããããã®éèšå€ãèšç®ãããããå Žåãªã©ã«äŸ¿å©ã§ãã
ã¬ã¬ã·ãŒ ããŒã¿ãæäœããããšã®æåã®å©ç¹ã¯ãåŸ ã¡æéãçãããšã§ã (ç¹ã«ããŒã¿ããŒã¹ãç°ãªãå°åã«åæ£ããŠããå Žå)ã XNUMX ã€ç®ã¯ãèªã¿åãå°çšãã©ã³ã¶ã¯ã·ã§ã³ã«ã¯ããã¯ããªãããšã§ãã ããã¯ãå€ãããŒã¿ãåŠçã§ããéãã倧éã®èªã¿åããè¡ãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠå€§ããªå©ç¹ã§ãã
ã¢ããªã±ãŒã·ã§ã³ ãµãŒããŒã¯ãææ°ããŒãžã§ã³ã倪平æŽã®å察åŽã§å©çšå¯èœãªå Žåã§ãã5 ç§å€ãããŒã¿ãããŒã«ã« ã¬ããªã«ããèªã¿åããŸãã
DBMS ã¯å€ãããŒãžã§ã³ãèªåçã«åé€ããå Žåã«ãã£ãŠã¯ãèŠæ±ã«å¿ããŠãããå®è¡ã§ããããã«ããŸãã ããšãã°ãPostgres ã§ã¯ãŠãŒã¶ãŒã次ã®ããšãè¡ãããšãã§ããŸãã VACUUM
èŠæ±ã«å¿ããŠããŸãå®æçã«ãã®æäœãèªåçã«å®è¡ããŸãã Spanner ã¯ã¬ããŒãž ã³ã¬ã¯ã¿ãŒãå®è¡ããŠãXNUMX æéããå€ãã¹ãããã·ã§ãããåé€ããŸãã
ããããæéãœãŒã¹ã¯æªã¿ã®åœ±é¿ãåããŸã
ã³ã³ãã¥ãŒã¿ãŒ ãµã€ãšã³ã¹ã«ãããæ倧ã®ç§å¯ã¯ããã¹ãŠã®ã¿ã€ãã³ã° API ãåãã€ããŠãããšããããšã§ãã å®éãç§ãã¡ã®æ©æ¢°ã¯æ£ç¢ºãªçŸåšæå»ãç¥ããŸããã ã³ã³ãã¥ãŒã¿ãŒã«ã¯ãæéãå»ãããã«äœ¿çšãããæ¯åãçºçããæ°Žæ¶æ¯ååãå«ãŸããŠããŸãã ãã ãã粟床ãååã§ã¯ãªããæ£ç¢ºãªæå»ããé²ãã§ãããé ãããããå¯èœæ§ããããŸãã ã·ãã㯠20 æ¥ããã XNUMX ç§ã«éããå ŽåããããŸãã ãããã£ãŠãã³ã³ãã¥ãŒã¿ã®æå»ããããã¯ãŒã¯ã®æå»ãšå®æçã«åæããå¿ èŠããããŸãã
NTP ãµãŒããŒã¯åæã«äœ¿çšãããŸãããåæããã»ã¹èªäœã¯ãããã¯ãŒã¯é 延ã®åœ±é¿ãåããŸãã åãããŒã¿ã»ã³ã¿ãŒå ã® NTP ãµãŒããŒãšã®åæã§ãæéãããããŸãã ãããªã㯠NTP ãµãŒããŒã䜿çšãããšãããã«å€§ããªæªã¿ãçããå¯èœæ§ãããããšã¯æããã§ãã
ååæèšãšããã«çžåœãã GPS ã¯çŸåšæå»ã枬å®ããã®ã«é©ããŠããŸãããé«äŸ¡ã§è€éãªèšå®ãå¿ èŠãªããããã¹ãŠã®è»ã«æèŒã§ããããã§ã¯ãããŸããã ãã®ãããããŒã¿ã»ã³ã¿ãŒã§ã¯éå±€åã¢ãããŒãã䜿çšãããŸãã ã¢ããã㯠ã¯ããã¯ã GPS ã¯ããã¯ã¯æ£ç¢ºãªæéã瀺ãããã®åŸãã»ã«ã³ã㪠ãµãŒããŒãéããŠä»ã®ãã·ã³ã«ãããŒããã£ã¹ããããŸãã ããã¯ãåãã·ã³ãæ£ç¢ºãªæéããäžå®ã®ãªãã»ãããçµéšããããšãæå³ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãšããŒã¿ããŒã¹ã (ç°ãªãããŒã¿ã»ã³ã¿ãŒã«ãªãå Žåã§ã) ç°ãªããã·ã³äžã«é 眮ãããŠããããšãå€ããšããäºå®ã«ãããç¶æ³ã¯ããã«æªåããŸãã ãããã£ãŠãæéã¯ãç°ãªããã·ã³ã«åæ£ããã DB ããŒãã ãã§ç°ãªãããã§ã¯ãããŸããã ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã§ãç°ãªããŸãã
Google TrueTime ã¯ãŸã£ããç°ãªãã¢ãããŒããæ¡çšããŠããŸãã ã»ãšãã©ã®äººã¯ãGoogle ã®ãã®æ¹åãžã®é²æ©ã¯ãååæèšãš GPS æèšãžã®å¹³å¡ãªç§»è¡ã«ãã£ãŠèª¬æããããšä¿¡ããŠããŸãããããã¯å šäœåã®äžéšã«ãããŸããã TrueTime ã®ä»çµã¿ã¯æ¬¡ã®ãšããã§ãã
- TrueTime ã¯ãGPS ãšååæèšãšãã XNUMX ã€ã®ç°ãªããœãŒã¹ã䜿çšããŸãã ãããã®æèšã«ã¯ãçžé¢é¢ä¿ã®ãªãæ
éã¢ãŒãããããŸãã [詳现ã¯5ããŒãžãåç
§]
ãã㧠â çŽç¿»èš³ïŒããã®ããããããã䜵çšãããšä¿¡é Œæ§ãé«ãŸããŸãã - TrueTime ã«ã¯çãã API ããããŸãã 枬å®èª€å·®ãšäžç¢ºå®æ§ãçµã¿èŸŒãŸããééãšããŠæéãè¿ããŸãã å®éã®ç¬éã¯ãééã®äžéãšäžéã®éã®ã©ããã«ãããŸãã Google ã®åæ£ããŒã¿ããŒã¹ã§ãã Spanner ã¯ãçŸåšæå»ãç¯å²å€ã§ãããšèšãããŸã§åŸ æ©ããã ãã§ãã ãã®æ¹æ³ã§ã¯ãç¹ã«ãã¹ã¿ãŒã®äžç¢ºå®æ§ãé«ãå Žåã«ã·ã¹ãã ã«å€å°ã®é 延ãçããŸãããã°ããŒãã«ã«åæ£ãããç¶æ³ã§ãæ£ç¢ºæ§ãä¿èšŒãããŸãã
Spanner ã³ã³ããŒãã³ã㯠TrueTime ã䜿çšããŸããããã§ãTT.now() ã¯ééãè¿ããŸãããã®ãããSpanner ã¯ãçŸåšæå»ãç¹å®ã®æç¹ãééãããšç¢ºä¿¡ã§ããæç¹ãŸã§ã¹ãªãŒãããã ãã§ãã
çŸåšæå»ã®æ±ºå®ç²ŸåºŠãäœäžãããšãSpanner ã®æäœæéãé·ããªããããã©ãŒãã³ã¹ãäœäžããŸãã ãã®ãããå®å šã«æ£ç¢ºãªæèšãå ¥æããããšã¯äžå¯èœã§ãã£ãŠããå¯èœãªéãæé«ã®ç²ŸåºŠãç¶æããããšãéèŠã§ãã
é ãã«ã¯å€ãã®æå³ããã
é 延ãšã¯äœãã«ã€ããŠåæ°äººã®å°é家ã«è³ªåãããšãããããç°ãªãçããåŸãããã§ãããã DBMS ã§ã¯ãé 延ã¯ãããŒã¿ããŒã¹é 延ããšåŒã°ããããšãå€ããã¯ã©ã€ã¢ã³ããèªèããé 延ãšã¯ç°ãªããŸãã å®éã«ã¯ãã¯ã©ã€ã¢ã³ãã¯ãããã¯ãŒã¯é 延ãšããŒã¿ããŒã¹é 延ã®åèšãç£èŠããŸãã å¢å€§ããåé¡ããããã°ããå Žåãã¬ã€ãã³ã·ãŒã®çš®é¡ãåé¢ããæ©èœãéèŠã§ãã ã¡ããªã¯ã¹ãåéããŠè¡šç€ºãããšãã¯ãåžžã«äž¡æ¹ã®ã¿ã€ãã«æ³šç®ããããã«ããŠãã ããã
ããã©ãŒãã³ã¹èŠä»¶ã¯ç¹å®ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«å¯ŸããŠè©äŸ¡ããå¿ èŠããããŸã
DBMS ã®ããã©ãŒãã³ã¹ç¹æ§ãšãã®å¶éã¯ãæžã蟌ã¿/èªã¿åãã®ã¹ã«ãŒããããšåŸ ã¡æéã®èŠ³ç¹ããæå®ãããå ŽåããããŸãã ããã¯äž»èŠãªã·ã¹ãã ãã©ã¡ãŒã¿ã®æŠèŠã瀺ããŠããŸãããæ°ãã DBMS ã®ããã©ãŒãã³ã¹ãè©äŸ¡ããå Žåãããå æ¬çãªã¢ãããŒãã¯ãéèŠãªæäœ (åã¯ãšãªããã³/ãŸãã¯ãã©ã³ã¶ã¯ã·ã§ã³ããš) ãåå¥ã«è©äŸ¡ããããšã§ãã äŸ:
- é¢é£ããŒãã«ã®æå®ãããå¶çŽãšè¡ããã£ã³ã°ã䜿çšããŠãããŒãã« X (50 äžè¡) ã«æ°ããè¡ãæ¿å ¥ãããšãã®æžã蟌ã¿ã¹ã«ãŒããããšåŸ æ©æéã
- å¹³ååéæ°ã500人ã®å Žåãç¹å®ã®ãŠãŒã¶ãŒã®åéã®åéã®è¡šç€ºãé ããã
- ãŠãŒã¶ãŒã 100 æéããã X ãšã³ããªãæã€ä»ã® 500 人ã®ãŠãŒã¶ãŒããã©ããŒããŠããå Žåã«ããŠãŒã¶ãŒã®å±¥æŽããäžäœ XNUMX ã®ãšã³ããªãååŸãããŸã§ã®åŸ ã¡æéã
ããŒã¿ããŒã¹ãããã©ãŒãã³ã¹èŠä»¶ãæºãããŠãããšç¢ºä¿¡ã§ãããŸã§ãè©äŸ¡ãšå®éšã«ã¯ãã®ãããªé倧ãªã±ãŒã¹ãå«ãŸããå ŽåããããŸãã åæ§ã®çµéšåã«ãããã¬ã€ãã³ã· ã¡ããªã¯ã¹ãåéã㊠SLO ã決å®ãããšãã«ããã®å èš³ãèæ ®ãããŸãã
åæäœã®ã¡ããªã¯ã¹ãåéãããšãã¯ãé«ãã«ãŒãã£ããªãã£ã«æ³šæããŠãã ããã ãã°ãã€ãã³ãåéããŸãã¯åæ£ãã¬ãŒã¹ã䜿çšããŠã匷åãªãããã° ããŒã¿ãååŸããŸãã èšäºã§ã¯ã
ãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ã¯å±éºãªå¯èœæ§ããããŸã
ãã¹ãŠã® DBMS ããã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããŠããããã§ã¯ãããŸãããããã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããŠããå Žåããã®ãããªãã©ã³ã¶ã¯ã·ã§ã³ã«ãã£ãŠäºæãã¬ãšã©ãŒãçºçããå¯èœæ§ãããããã®ãšã©ãŒã¯å¿ ãããæ€åºã容æã§ã¯ãããŸãã (ã€ãŸããäœããã®ç°åžžãããããšãæããã§ããå¿ èŠããããŸã)ã
ãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ãæ€åºããŠãã€ãã¹ã§ããã¯ã©ã€ã¢ã³ã ã©ã€ãã©ãªã䜿çšãããšããã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ã®äœ¿çšãåé¿ã§ããŸãã ãã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ãæŸæ£ã§ããªãå Žåã¯ããã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ãåå ã§å®äºãããã©ã³ã¶ã¯ã·ã§ã³ã誀ã£ãŠäžæ¢ããããšããäºæãã¬ç¶æ³ãé¿ããããã«ããã®å®è£ ã«ç¹å¥ãªæ³šæãæã£ãŠãã ããã
ãã©ã³ã¶ã¯ã·ã§ã³ãç°ãªãã¬ã€ã€ãŒã«ã«ãã»ã«åãããšãäºæããªããã¹ãããããã©ã³ã¶ã¯ã·ã§ã³ãçºçããå¯èœæ§ããããã³ãŒãã®å¯èªæ§ã®èŠ³ç¹ãããäœæè ã®æå³ãç解ããããšãå°é£ã«ãªãå¯èœæ§ããããŸãã 次ã®ããã°ã©ã ãèŠãŠãã ããã
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 int64
with newTransaction():
newSeq := atomic.Increment(&seq)
Entries.query(newSeq)
// Other operations...
äžèšã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãæçµçµæã«é¢ä¿ãªããå®è¡ããããã³ã«ã·ãŒã±ã³ã¹çªå·ãã€ã³ã¯ãªã¡ã³ãããŸãã ãããã¯ãŒã¯ã®åé¡ã«ããã³ãããã倱æããå Žåãåè©Šè¡ãããšãªã¯ãšã¹ãã¯å¥ã®ã·ãŒã±ã³ã¹çªå·ã§å®è¡ãããŸãã
ã¯ãšãª ãã©ã³ããŒã¯ããŒã¿ããŒã¹ã«ã€ããŠå€ãã®ããšãæããŠãããŸã
ã¯ãšãª ãã©ã³ãã¯ãããŒã¿ããŒã¹å ã§ã¯ãšãªãã©ã®ããã«å®è¡ããããã決å®ããŸãã ãŸãããªã¯ãšã¹ããéä¿¡ããåã«åæããæé©åããŸãã ãã©ã³ããŒã¯ãèªç±ã«äœ¿ããä¿¡å·ã«åºã¥ããŠãèããããæšå®å€ãããã€ãæäŸããããšããã§ããŸããã ããšãã°ã次ã®ã¯ãšãªã«æé©ãªæ€çŽ¢æ¹æ³ã¯äœã§ãã?
SELECT * FROM articles where author = "rakyll" order by title;
çµæã¯æ¬¡ã® XNUMX ã€ã®æ¹æ³ã§ååŸã§ããŸãã
- ãã«ããŒãã«ã¹ãã£ã³: ããŒãã«å ã®åãšã³ããªã調ã¹ãŠãäžèŽããèè åãæã€èšäºãè¿ãããããã䞊ã¹æ¿ããããšãã§ããŸãã
- ã€ã³ããã¯ã¹ã¹ãã£ã³: ã€ã³ããã¯ã¹ã䜿çšããŠãäžèŽãã ID ãæ€çŽ¢ãããããã®è¡ãååŸãã䞊ã¹æ¿ããããšãã§ããŸãã
ã¯ãšãª ãã©ã³ããŒã®ä»äºã¯ãã©ã®æŠç¥ãæé©ããå€æããããšã§ãã ã¯ãšãª ãã©ã³ããŒã®äºæž¬æ©èœã¯éãããŠããããšãèæ ®ãã䟡å€ããããŸãã ããã¯ééã£ã決å®ã«ã€ãªããå¯èœæ§ããããŸãã DBA ãéçºè ã¯ããããã䜿çšããŠãããã©ãŒãã³ã¹ã®äœãã¯ãšãªã蚺æãã埮調æŽããããšãã§ããŸãã DBMS ã®æ°ããããŒãžã§ã³ã§ã¯ã¯ãšãª ãã©ã³ããŒãæ§æã§ããæ°ããããŒãžã§ã³ã«ãã£ãŠããã©ãŒãã³ã¹ã®åé¡ãçºçããå Žåã«ããŒã¿ããŒã¹ãæŽæ°ãããšãã«èªå·±èšºæã圹ç«ã¡ãŸãã é ãã¯ãšãªã®ãã°ãã¬ã€ãã³ã·ã®åé¡ã¬ããŒãããŸãã¯å®è¡æéã®çµ±èšã¯ãæé©åãå¿ èŠãªã¯ãšãªãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
ã¯ãšãª ãã©ã³ããŒã«ãã£ãŠæ瀺ãããäžéšã®ã¡ããªãã¯ã¯ããã€ãºã®åœ±é¿ãåããå¯èœæ§ããããŸã (ç¹ã«ãã¬ã€ãã³ã·ã CPU æéãèŠç©ããå Žå)ã ã¹ã±ãžã¥ãŒã©ã«è¿œå ãããšãå®è¡ãã¹ã远跡ããã³è¿œè·¡ããããã®ããŒã«ãè¿œå ãããŸãã ãããã䜿çšãããšããã®ãããªåé¡ã蚺æã§ããŸã (æ®å¿µãªããããã¹ãŠã® DBMS ããã®ãããªããŒã«ãæäŸããŠããããã§ã¯ãããŸãã)ã
ãªã³ã©ã€ã³ç§»è¡ã¯å°é£ã ãå¯èœ
ãªã³ã©ã€ã³ ãã€ã°ã¬ãŒã·ã§ã³ãã©ã€ã ãã€ã°ã¬ãŒã·ã§ã³ããŸãã¯ãªã¢ã«ã¿ã€ã ãã€ã°ã¬ãŒã·ã§ã³ãšã¯ãããŠã³ã¿ã€ã ãããŒã¿ç Žæãçºçãããã«ãããããŒã¿ããŒã¹ããå¥ã®ããŒã¿ããŒã¹ã«ç§»è¡ããããšãæå³ããŸãã 移è¡ãåã DBMS/ãšã³ãžã³å ã§çºçããå Žåãã©ã€ã ãã€ã°ã¬ãŒã·ã§ã³ã®å®è¡ã容æã«ãªããŸãã ããã©ãŒãã³ã¹ãã¹ããŒãã®èŠä»¶ãç°ãªãæ°ãã DBMS ã«ç§»è¡ããå¿ èŠãããå Žåãç¶æ³ã¯ããã«è€éã«ãªããŸãã
ããŸããŸãªãªã³ã©ã€ã³ç§»è¡ã¢ãã«ããããŸãã ããã«ãã® XNUMX ã€ã瀺ããŸãã
- äž¡æ¹ã®ããŒã¿ããŒã¹ã§äºéå ¥åãæå¹ã«ããŸãã ãã®æ®µéã®æ°ããããŒã¿ããŒã¹ã«ã¯ãã¹ãŠã®ããŒã¿ãå«ãŸããŠããããã§ã¯ãªããææ°ã®ããŒã¿ã®ã¿ãåãå ¥ããŸãã ããã確èªãããã次ã®ã¹ãããã«é²ãããšãã§ããŸãã
- äž¡æ¹ã®ããŒã¿ããŒã¹ããã®èªã¿åããæå¹ã«ããŸãã
- èªã¿åããšæžã蟌ã¿ãäž»ã«æ°ããããŒã¿ããŒã¹ã§å®è¡ãããããã«ã·ã¹ãã ãæ§æããŸãã
- å€ãããŒã¿ããŒã¹ããã®ããŒã¿ã®èªã¿åããç¶ç¶ããªãããå€ãããŒã¿ããŒã¹ãžã®æžã蟌ã¿ãåæ¢ããŸãã ãã®æ®µéã§ã¯ãæ°ããããŒã¿ããŒã¹ã«ã¯ãŸã ããŒã¿ãããã€ããããŸããã ãããã¯å€ãããŒã¿ããŒã¹ããã³ããŒããå¿ èŠããããŸãã
- å€ãããŒã¿ããŒã¹ã¯èªã¿åãå°çšã§ãã äžè¶³ããŠããããŒã¿ãå€ãããŒã¿ããŒã¹ããæ°ããããŒã¿ããŒã¹ã«ã³ããŒããŸãã 移è¡ãå®äºãããããã¹ãæ°ããããŒã¿ããŒã¹ã«åãæ¿ããå€ãããŒã¿ããŒã¹ãåæ¢ããŠã·ã¹ãã ããåé€ããŸãã
詳现ã«ã€ããŠã¯ããåãåããããã ãããšããå§ãããŸã
ããŒã¿ããŒã¹ã®å€§å¹ ãªå¢å ã«ã¯äºæž¬äžå¯èœæ§ã®å¢å ã䌎ããŸã
ããŒã¿ããŒã¹ã®æé·ã«ããããã®èŠæš¡ã«é¢é£ããäºæž¬äžå¯èœãªåé¡ãçºçããŸãã ããŒã¿ããŒã¹ã®å
éšæ§é ã«ã€ããŠç¥ãã°ç¥ãã»ã©ãããŒã¿ããŒã¹ãã©ã®ããã«æ¡åŒµãããããããæ£ç¢ºã«äºæž¬ã§ããããã«ãªããŸãã ãã ãããŸã äºæž¬ã§ããªãç¬éããããŸãã
ããŒã¹ãæ¡å€§ããã«ã€ããŠãããŒã¿éãšãããã¯ãŒã¯åž¯åå¹
ã®èŠä»¶ã«é¢ãã以åã®ä»®å®ãæåŸ
ãæ代é
ãã«ãªãå¯èœæ§ããããŸãã ãã®ãšããæœåšçãªåé¡ãåé¿ããããã«ã倧èŠæš¡ãªèšèšã®èŠçŽãã倧èŠæš¡ãªéçšæ¹åãå±éã®åæ€èšããŸãã¯ä»ã® DBMS ãžã®ç§»è¡ã®åé¡ãçããŸãã
ãã ããæ¢åã®ããŒã¿ããŒã¹ã®å éšæ§é ã«é¢ããåªããç¥èã ããå¿ èŠã§ãããšã¯èããªãã§ãã ããã æ°ãã秀ã¯ãæ°ããªæªç¥ããããããŸãã äºæž¬ã§ããªãåé¡ç¹ãäžåäžãªããŒã¿åæ£ãäºæããªã垯åå¹ ãšããŒããŠã§ã¢ã®åé¡ãå¢å ãç¶ãããã©ãã£ãã¯ãšæ°ãããããã¯ãŒã¯ ã»ã°ã¡ã³ãã«ãããããŒã¿ããŒã¹ã®ã¢ãããŒããããŒã¿ ã¢ãã«ãå±éã¢ãã«ãããŒã¿ããŒã¹ ãµã€ãºã®åèãå¿ èŠã«ãªããŸãã
...
ãã®èšäºã®å
¬éãèãå§ããæç¹ã§ãå
ã®ãªã¹ãã«ã¯ãã§ã«ããã« XNUMX ã€ã®é
ç®ããããŸããã ãããããããæ°ãæ¥ãã
PS
ç§ãã¡ã®ããã°ããèªã¿ãã ãã:
- «
ããŒã¿ããŒã¹ãš Kubernetes (ã¬ãã¥ãŒãšãã㪠ã¬ããŒã) "; - «
åæ£ãã¬ãŒã·ã³ã°: ç§ãã¡ã®ããæ¹ã¯ééã£ãŠããŸãã "; - «
ãµãŒãã¹ ã¡ãã·ã¥: ãã¹ãŠã®ãœãããŠã§ã¢ ãšã³ãžãã¢ãæã泚ç®ãããŠãããã¯ãããžã«ã€ããŠç¥ã£ãŠããã¹ãããš 'ã
åºæïŒ habr.com