MS_DBMSLockingAndIsolation - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- æ»ãïŒSQL Server åé¡ã®åææ¹æ³ãããŒã¿ã¢ã¯ã»ã¹ã®ããããïŒ
- DBMSã®ããã¯ã»å颿Šç¥ãšåæå®è¡å¶åŸ¡
- SQL Server ã®é害埩æ§
- SQL Server ã§ã®ããã¯ã»ã¿ã€ã ã¢ãŠã / SQL Server ã®ããã¯ã®ãšã¹ã«ã¬ãŒã·ã§ã³ / SQL Server ã§ã®ãããããã¯
- SQL Server 倧éããŒã¿åŠçæã®æ§èœåé¡ / SQL Server ã¢ããã㯠ã¯ãšãªåé¡ã®ç£èŠ / SQL Server çµåæ¹åŒã®åé¡ãç£èŠãã
æ¬ããã¥ã¡ã³ãã§ã¯ãããŒã¿ããŒã¹ ã¢ããªã±ãŒã·ã§ã³ã
éçºããéã«ç¥ã£ãŠããå¿
èŠããããDBMS æ¯ã®
- ããã¯ã»å颿Šç¥
- åæå®è¡å¶åŸ¡
ã説æããã
äŸãã°ãOracle ãš SQL Server ã®ããŒã¿ã®
- ããã¯ã»å颿Šç¥ãšã
- åæå®è¡å¶åŸ¡ã«ã¯
以äžã®ãããªéããããã
- Oracle ã§ã¯ãåç
§ãã¹ãããŒã¿ã®ããŒãžã§ã³ã倿ãã
ããã¯ãç²åŸããªãã§ããŒã¿ã®èªã¿åãäžè²«æ§ãåæå®è¡å¶åŸ¡ãå®çŸããŠããã - SQL ServerïŒã®æ¢å®ã®èšå®ïŒã§ã¯ãããã¯å¶åŸ¡ã«ãã£ãŠã
ããŒã¿ã®èªã¿åãäžè²«æ§ãåæå®è¡å¶åŸ¡ãå®çŸããŠããã
ãã®ãããªå®è£
ã®éããææ¡ããªããŸãŸã
Oracle ãšåãæèŠã§ SQL Server ã¢ããªã±ãŒã·ã§ã³ãéçºããå Žåã
æå³ããªãããã¯åŸ
ã¡ãçºçããããšã«ãªãã
ããã©ãŒãã³ã¹ã®å£åããããããã¯ã®çºçãªã©ã®åé¡ã«æ©ãŸãããããšã«ãªãã
1 ã€ä»¥äžã® SQL æãå«ãäœæ¥åäœã§ããã©ã³ã¶ã¯ã·ã§ã³ãæå¹ã§ããã«ã¯ã
ACID ãšåŒã°ãã 4 ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®åºæ¬ç¹æ§ãåããŠããå¿
èŠãããã
| ç¹æ§ | è±èª |
|---|---|
| ååæ§ | Atomicity |
| äžè²«æ§ | Consistency |
| åé¢ïŒç¬ç«ïŒæ§ | Isolation |
| æç¶ïŒæ°žç¶ïŒæ§ | Durability |
ãããå®çŸããããã®ãããã¯ã»å颿Šç¥ãšãåæå®è¡å¶åŸ¡ã®ä»çµã¿ã¯ã
以äžã®ããã« Oracle ãš SQL Server ã§å€§ããªçžéãããã
- Oracle ã§ã¯ãäžæé åã䜿çšãããå€ããŒãžã§ã³æ³ã
ïŒMultiVersion Concurrency Control:MVCCïŒã䜿çšããã - SQL ServerïŒã®æ¢å®ã®èšå®ïŒã§ã¯ãããã¯æ³ãã䜿çšããã
次ç¯ã§ã¯ã
- ãå€ããŒãžã§ã³æ³ã
- ãããã¯æ³ã
ã®æŠèŠã«ã€ããŠèª¬æããã
â» ãªããæ¬ããã¥ã¡ã³ãã§ã¯ãå€ããŒãžã§ã³æ³ããšãããã¯æ³ãã®åªå£ã«ã€ããŠã¯èšåããªãã
å€ããŒãžã§ã³æ³ïŒMultiVersion Concurrency Control:MVCCïŒãšã¯ã
æ°æ§ã®ãè€æ°ã®ããŒãžã§ã³ã®ããŒã¿ãä¿æããŠ
ããŒã¿ã®èªã¿åãäžè²«æ§ãä¿èšŒããããã®ä»çµã§ããã
ãã®ãããOracle ã¯ãããã«ãããŒãžã§ã³ ããŒã¿ããŒã¹ãã
ãå€ããŒãžã§ã³ ããŒã¿ããŒã¹ããªã©ãšåŒã°ããã
- Oracle ã§ã¯ãããã¢ããªã±ãŒã·ã§ã³ãæŽæ°ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ãããšã
ããŒã¿ã®æ§ããŒãžã§ã³ã¯äžæé åã«ä¿æãããã - ä»ã®ã¢ããªã±ãŒã·ã§ã³ããã®ããŒã¿ã«å¯Ÿããèªã¿åãèŠæ±ããããšã
äžæé åã«ä¿æãããæ§ããŒãžã§ã³ã®ããŒã¿ãåãåºãã - æŽæ°ãã©ã³ã¶ã¯ã·ã§ã³ãã³ãããããããšãäžæé åã®æ§ããŒãžã§ã³ã¯æ¶å»ããã
ã¢ããªã±ãŒã·ã§ã³ã¯ããŒãã«äžã®æ°ããŒãžã§ã³ã®ããŒã¿ãèŠãããšã«ãªãã
SQL ServerïŒã®æ¢å®ã®èšå®ïŒã§ã¯ãããŒã¿ã®èªã¿åãäžè²«æ§ã®ä¿èšŒã®ä»çµã¿ãšããŠ
ãããã³ã°ã»ã¡ã«ããºã ã䜿çšããŠããã
- ããã¢ããªã±ãŒã·ã§ã³ãæŽæ°ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ãããšã
ããŒãã«å ã®æŽæ°ã¬ã³ãŒãã«ã¯æä»ããã¯ïŒXïŒãä¿æãããã - ä»ã®ã¢ããªã±ãŒã·ã§ã³ããã®ã¬ã³ãŒãã«å¯Ÿããèªã¿åãèŠæ±ããããšã
æªã³ãããæžã¿èªã¿åãïŒRead UnCommittedïŒä»¥å€ã®èªã¿åããã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ã
ã¬ã³ãŒããåãåºãããšã¯èš±å¯ãããåŸ ããããããšã«ãªãã - æŽæ°ãã©ã³ã¶ã¯ã·ã§ã³ãã³ãããããããšãæä»ããã¯ïŒXïŒãè§£é€ããã
ã¢ããªã±ãŒã·ã§ã³ã¯æŽæ°ãããã¬ã³ãŒããèŠãããšã«ãªãã
- ãå€ããŒãžã§ã³æ³ããæ¡çšããŠããããŒã¿ããŒã¹ã«ã¯ã
OracleãPostgreSQLãMySQL ãªã©ãããã - ãããã¯æ³ããæ¡çšããŠããããŒã¿ããŒã¹ã«ã¯
SQL ServerãDB2ãHiRDB ãªã©ãããã
äžè¬çãªåæå®è¡å¶åŸ¡æ¹åŒã¯ãããã¯æ³ããšèšãããŠãããã
è¿å¹Žã¯ããå€ããŒãžã§ã³æ³ãã®åæå®è¡å¶åŸ¡ã«å¯Ÿå¿ãã DBMS ãå¢ããŠããŠããã

è£è¶³ïŒæ§ããŒãžã§ã³ã®çœ®ãå ŽæïŒ: ãäžæé åãã®å®äœã¯ DBMS ããšã«ç°ãªãã
ãããéçšäžã®æ³šæç¹ã®éãã«çŽçµããã
DBMS æ§ããŒãžã§ã³ã®ä¿æå 泚æç¹ Oracle UNDO 衚é å é·æéã®åç §ã§ ORA-01555 ã¹ãããã·ã§ãããå€ãããŸãPostgreSQL ããŒãã«æ¬äœïŒè¿œèšåïŒ äžèŠè¡ã®ååã« VACUUMãå¿ èŠãããŒãã«è¥å€§åSQL ServerïŒRCSI/SNAPSHOTïŒ tempdb ã®ããŒãžã§ã³ ã¹ã㢠tempdb ã® I/O ãšãµã€ãºãå¢ãã SQL Server ã§å€ããŒãžã§ã³æ³ãæå¹ã«ããå Žåã
tempdb ãæ§èœäžã®ã¯ãªãã£ã«ã« ãã¹ã«ãªãç¹ã¯å¿ ãæŒãããŠããããš
ïŒSQL Server ã®ãã¡ã€ã«ã®é 眮åç §ïŒã
å€ããŒãžã§ã³æ³ãšãããã¯æ³ã®æã倧ããªéãã¯ã
æŽæ°äžã®ããŒã¿ã«å¯ŸããŠæ€çŽ¢ãè¡ã£ãå Žåã§ããã
Oracle ã§ã¯ãå€ããŒãžã§ã³æ³ã«ãããäžæé åã«ä¿æãããã
æ§ããŒãžã§ã³ã®ããŒã¿ãèªã¿èŸŒãã
ã€ãŸããOracle ã§ã¯ãèªã¿åãããŒã¿ãæŽæ°äžã§ãã£ãŠã
æ€çŽ¢åŠçãåŸ
ããããããšã¯ãªãã
ããã«å¯ŸããSQL Server ã§ã¯ãããã¯æ³ã«ããåæå®è¡å¶åŸ¡ã®ããã
æ€çŽ¢æã«å
±æããã¯ããããã
èªã¿åãããŒã¿ãæŽæ°äžã®å Žåã¯ããã§ã«ãã®ããŒã¿ã«æä»ããã¯ãããã£ãŠããããã
å
±æããã¯ããããããšãã§ããªãã
ã€ãŸããSQL Server ã§ã¯ãæŽæ°äžã®ããŒã¿ã«èªã¿æã¯ã¢ã¯ã»ã¹ã§ããã
æ€çŽ¢åŠçãåŸ
ããããã
ãã®ãããªãå®è£
ã®ç¹åŸŽãçè§£ããŠããªããšãã¢ããªã±ãŒã·ã§ã³éçºè
ã¯ã
ããã©ãŒãã³ã¹å£åããããããã¯ãªã©ã®ãã©ãã«ã«èŠèãããããšã«ãªãã
-
ãã©ã³ã¶ã¯ã·ã§ã³ã®åé¢ã¬ãã«ãšã¯ããã©ã³ã¶ã¯ã·ã§ã³ãã
ä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ããåé¢ããå¿ èŠæ§ã®åºŠåãã®ããšã§ããã- åé¢ã¬ãã«ãé«ããªããšããŒã¿ã®äžè²«æ§ã¯ç¢ºä¿ããããã
ã¢ããªã±ãŒã·ã§ã³ã®åæå®è¡æ§ã¯äœäžããã - åé¢ã¬ãã«ãäœããªããšã¢ããªã±ãŒã·ã§ã³ã®åæå®è¡æ§ã¯åäžãããã
ããŒã¿ã®æ£ç¢ºæ§ã¯äœäžããã
- åé¢ã¬ãã«ãé«ããªããšããŒã¿ã®äžè²«æ§ã¯ç¢ºä¿ããããã
-
Oracle ã¯ã
- ã³ãããèªã¿åã(Read Committed)
- çŽåå¯èœ(Serializable)
ã® 2 ã€ããµããŒãããŠããã
-
ããã«å¯ŸããSQL Server ã¯ã
ANSI/ISO æšæºã®ãã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã«ããã¹ãŠãµããŒãããŠããã- æªã³ãããèªã¿åã(Uncommitted Read)
- ã³ãããèªã¿åã(Read Committed)
- ç¹°ãè¿ãå¯èœèªã¿åãïŒRepeatable Read)
- çŽåå¯èœ(Serializable)
-
Oracle ã SQL Server ãããã©ã«ãã®
ãã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã«ã¯ã³ãããèªã¿åã(Read Committed) ã§ããã
以äžã«ãOracle ãš SQL Server ããµããŒããã
ANSI/ISO æšæºã®ãã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã«ã®å¯Ÿå¿è¡šã瀺ãã
| ANSIã»ISOæšæºã®ãã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã« | Oracle | SQL Server |
|---|---|---|
| æªã³ãããèªã¿åã(Uncommitted Read) | æªãµããŒã | â |
| ã³ãããèªã¿åã(Read Committed) | â(default) | â(default) |
| ç¹°ãè¿ãå¯èœèªã¿åãïŒRepeatable Read) | æªãµããŒã | â |
| çŽåå¯èœ(Serializable) | â | â |
ç§»è¡ã¡ã¢ïŒäœè£ïŒ: å ããŒãžã® SQL Server ããµããŒãããåé¢ã¬ãã«ã®åæã«
ãç¹°ãè¿ãå¯èœèªã¿åãïŒRepeatable Read)|æªãµããŒãããšãã
è¡šã®æçãçŽã蟌ãã§ããïŒçŽåŸã®å¯Ÿå¿è¡šã®äžéšãšæãããïŒã
SQL Server 㯠Repeatable Read ããµããŒãããŠãããããåé€ããã
è£è¶³ïŒSQL Server ã«ã¯ 5 ã€ç®ãããïŒ: äžã® 4 ã€ã«å ãã
SQL Server ã«ã¯SNAPSHOTåé¢ã¬ãã«ïŒSQL Server 2005 以éïŒãããã
ANSI/ISO æšæºã«ã¯ãªãç¬èªã®ã¬ãã«ã§ãæ¬ããŒãžåŸåã§æ±ãã
ANSI/ISO SQL èŠæ Œã¯ãåæã«å®è¡ããããã©ã³ã¶ã¯ã·ã§ã³ã®åé¢ã¬ãã«ãš
åæå®è¡ã«ããã 3 ã€ã®åé¡ç¹ãå®çŸ©ããŠããã
次ã«ããã® 3 ã€ã®åé¡ç¹ã«ã€ããŠèª¬æãã
ïŒåæå®è¡ã«ãããæãåºæ¬çãªåé¡ç¹ã§ãããæŽæ°ããŒã¿ã®æ¶å€±ãã¯ã次ç¯ã§èª¬æããïŒã
åæã«å®è¡ãããŠããã
ãŸã ã³ããããããŠããªããã©ã³ã¶ã¯ã·ã§ã³ã
æžã蟌ãã ããŒã¿ãèªã¿èŸŒãã§ããŸãã

ãã©ã³ã¶ã¯ã·ã§ã³ãéå»ã«èªã¿èŸŒãã ããŒã¿ãããäžåºŠèªã¿èŸŒãããšãããšãã
ä»ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ãã£ãŠæžãæããããã³ããããããããŒã¿ãåŸãŠããŸãã

ãã©ã³ã¶ã¯ã·ã§ã³ããããè¡ã®éåãè¿ãæ€çŽ¢æ¡ä»¶ã§åãåãããåå®è¡ãããšãã
å¥ã®ãã©ã³ã¶ã¯ã·ã§ã³ããã®åãåããæ¡ä»¶ãæºããè¡ã远å ããèªã¿èŸŒãã§ããŸãã

| ANSIã»ISOæšæºã®ãã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã« | ããŒãã£ã»ãªãŒã | å埩äžå¯èœèªã¿åã | ãã¡ã³ãã ã»ãªãŒã |
|---|---|---|---|
| æªã³ãããèªã¿åã(Uncommitted Read) | æ | æ | æ |
| ã³ãããèªã¿åã(Read Committed) | ïŒ | æ | æ |
| ç¹°ãè¿ãå¯èœèªã¿åãïŒRepeatable Read) | ïŒ | ïŒ | æ |
| çŽåå¯èœ(Serializable) | ïŒ | ïŒ | ïŒ |
æ¬ç¯ã§ã¯ãOracle ãš SQL Server ã®åé¢ã¬ãã«ã®å®çŸæ¹åŒã«ã€ããŠèª¬æããã
-
Oracle ã§ã¯ãåç §ããããŒã¿ã®ããŒãžã§ã³ãéžæããããšã«ããã
ã³ãããæžã¿èªã¿åã(Read Committed)ã»çŽåå(Serializable) ã®åé¢ã¬ãã«ãå®çŸããã -
SQL Server ã§ã¯ãåé¢ã¬ãã«ã®èšå®ã«ããã
ããŒã¿åç §æã«é©çšãããããã¯ã®æéãããã¯ã®çš®é¡ã倿Žãããã
| ANSI/ISOæšæºãã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã« | Oracle | SQL Server |
|---|---|---|
| æªã³ãããèªã¿åã(Uncommitted Read) | æŽæ°äžã®ããŒã¿ã¯ãäžæé åãåç §ããããšã§ãããŒãã£ãŒããŒã¿ãèªãŸãªãããã«å¶åŸ¡ããŠããã | ãã©ã³ã¶ã¯ã·ã§ã³å ã® SELECT ã¹ããŒãã¡ã³ãã§ãå ±æããã¯ã䜿çšããªãããã®ãããããŒãã£ãŒããŒã¿ãåç §ããŠããŸãå¯èœæ§ãæãã |
| ã³ãããèªã¿åã(Read Committed) | ïŒåäžïŒ | ããŒã¿ã®èªã¿åãã«ãäžæçã«å ±æããã¯ã䜿çšããããŒãã£ãŒããŒã¿ãèªãŸãªãããã«å¶åŸ¡ããŠããããã ããå ±æããã¯ãä¿æããªãããããã©ã³ã¶ã¯ã·ã§ã³ãçµäºããåã«ãããŒã¿ã倿Žãããå¯èœæ§ãããã |
| ç¹°ãè¿ãå¯èœèªã¿åãïŒRepeatable Read) | ïŒåäžïŒ | ãã©ã³ã¶ã¯ã·ã§ã³çµäºãŸã§ãå ±æããã¯ãä¿æããç¹°ãè¿ãå¯èœèªã¿åããå®çŸããããã ããããŒç¯å²ããã¯ãé©çšãããªãããããã©ã³ã¶ã¯ã·ã§ã³ãçµäºããåã«ãåç §ããŒã¿ã«è¡ãæ¿å ¥ãããå¯èœæ§ãããã |
| çŽåå¯èœ(Serializable) | èªãã©ã³ã¶ã¯ã·ã§ã³ã®éå§ä»¥éã«éå§ããããã©ã³ã¶ã¯ã·ã§ã³ãæ¿å ¥ããè¡ã«é¢ããŠã¯ãåç §ããŒã¿ã«å«ããªãããã«å¶åŸ¡ããŠããã | ãã©ã³ã¶ã¯ã·ã§ã³å ã® SELECT ã¹ããŒãã¡ã³ãã§ããã©ã³ã¶ã¯ã·ã§ã³çµäºãŸã§å ±æããã¯ã»ããŒç¯å²ããã¯ãä¿æããçŽåå¯èœãå®çŸããã |
è£è¶³ïŒ
NOLOCKã¯ãããã¯ããªããã ãã§ã¯ãªãïŒ: æªã³ãããèªã¿åã
ïŒWITH (NOLOCK)/SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDïŒã¯
ãå€å°å€ãããŒã¿ãèªããŠãæ§ããªããçšåºŠã«çè§£ãããã¡ã ããå®éã«ã¯
ååšããªãããŒã¿ãèªãïŒååšããããŒã¿ãèªã¿èœãšãããšãããã
- ããŒãžåå²ãèµ·ããŠããæäžã«ã¹ãã£ã³ãããšã
åãè¡ã 2 åèªãããŸãã¯è¡ã 1 ä»¶ãèªãŸãªã- éèšå€ãå®åšããªãå€ã«ãªã
- çšã«
ãšã©ãŒ 601ïŒããŒã¿ã®ç§»åã«ããã¹ãã£ã³ãç¶è¡ã§ããªãïŒã§å€±æãããåç §ãéããã
NOLOCKããšãã察åŠã¯ã
åŸè¿°ã® RCSI ã«çœ®ãæããã¹ãã§ããã
次ã«ããæŽæ°ããŒã¿ã®æ¶å€±ãã®å¯ŸåŠæ³ãšãåé¢ã¬ãã«ãšã®é¢ä¿ã説æããã
2 ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ãè¡ãèªã¿åãããããããè¡ãæŽæ°ããŠããŸã£ããšãã
- æåã«æŽæ°ãããã©ã³ã¶ã¯ã·ã§ã³ã®å€æŽã¯ã
åŸããæŽæ°ãããã©ã³ã¶ã¯ã·ã§ã³ã®å€æŽã«ãã£ãŠäžæžããããã - æåã«æŽæ°ãããã©ã³ã¶ã¯ã·ã§ã³ã®æŽæ°ã¯ãæ°ãä»ããªããã¡ã«å€±ãããŠããŸãã
åŸã§åé¡ãçºçããã

ãæŽæ°ããŒã¿ã®æ¶å€±ãã¯ã以äžã®æ¹æ³ã§åé¿ã§ããã
-
ããã¯ã䜿çšããªã Oracle ããŒã¿ããŒã¹ã§ã¯ã
- æŽæ°å¯Ÿè±¡ã®ããŒã¿ã«ã¯ãæç€ºçã«æŽæ°ããã¯ãããŒã«ãã§æãã
ïŒSELECT ... FOR UPDATEïŒã - ãã©ã³ã¶ã¯ã·ã§ã³ã®åé¢ã¬ãã«ã«ãçŽåå(Serializable) ãæå®ããå Žåã
ãã¬ã³ãŒãã«å¯Ÿãã倿Žããèªãã©ã³ã¶ã¯ã·ã§ã³ã®éå§æã«ãã§ã«ã³ããããããŠãã
ä»ãã©ã³ã¶ã¯ã·ã§ã³ã«ãããã®ã§ãããšæ±ºå®ã§ããå Žåã®ã¿ã
èªãã©ã³ã¶ã¯ã·ã§ã³ã®ã³ããããèš±å¯ãããã
ãšããå¶åŸ¡ã䜿çšããã
- æŽæ°å¯Ÿè±¡ã®ããŒã¿ã«ã¯ãæç€ºçã«æŽæ°ããã¯ãããŒã«ãã§æãã
-
SQL Server ã§ã¯ã
- ç¹°ãè¿ãå¯èœèªã¿åã(Repeatable Read) 以äžã®åé¢ã¬ãã«ã§ã
察象ããŒã¿ã«å ±æããã¯ãããŒã«ãã§æããã - ã³ãããæžã¿èªã¿åã(Read Committed) ã®åé¢ã¬ãã«ã§ã
æç€ºçã«æŽæ°ããã¯ãããŒã«ãã§æããïŒWITH (UPDLOCK)ïŒã
- ç¹°ãè¿ãå¯èœèªã¿åã(Repeatable Read) 以äžã®åé¢ã¬ãã«ã§ã
æ¬ç« ã§ã¯ãããã¯ã®äºææ§ãšãæŽæ°ããã¯ã«ã€ããŠè©³ãã説æããã
åºæ¬çãªããã¯ã®äºææ§ã«ã€ããŠã¯ä»¥äžã®è¡šã«ç€ºãéãã§ããã
Oracle ã«é¢ããŠã¯ãåç
§æã«ããã¯ãæããããšãç¡ãããã
- ãå
±æããã¯ãååšããªãã
- â ãå
±æããã¯ãšæä»ããã¯ã®éããç¡ãã
- â ãæä»ããã¯ã®ã¿ååšããã
- â ãå
±æããã¯ãšæä»ããã¯ã®éããç¡ãã
ãšèšãããšã«ãªãã
| èŠæ±ãããã¢ãŒã  æ¢ã«ãããããŠããã¢ãŒã | å ±æ(S) | æŽæ°(U) | æä»(X) |
|---|---|---|---|
| å ±æ(S) | â | â | à |
| æŽæ°(U) | â | à | à |
| æä»(X) | Ã | Ã | Ã |
â»ãSQL Server ã«ã¯ãã€ã³ãã³ãããã¯çãç¹æ®ãªããã¯ãååšãããã
ãŠãŒã¶ãå¶åŸ¡ãããã®ã§ã¯ç¡ããããããã§ã¯å²æããã
Oracle ãš SQL Server ã®æŽæ°ããã¯ã¯ãåæ¹ãæŽæ°ããŒã¿ã®æ¶å€±ããé²ã圹å²ã§äœ¿çšãããã
SQL Server ã®å ŽåããæŽæ°ããŒã¿ã®æ¶å€±ãã®é²æ¢ã¯ãå
±æããã¯ã§ãäºè¶³ããã
ãã®ãããSQL Server ã®æŽæ°ããã¯ã¯ããããããã¯ã鲿¢ã®ãããšèšãããã
è£è¶³: æŽæ°ããã¯ããããããã¯ãé²ãä»çµã¿ã®è©³çްã¯ã
SQL Server ã§ã®ãããããã¯ã®è£è¶³ãåç §ã
åè¿°ã®ããå€ããŒãžã§ã³æ³ãã»ãããã¯æ³ãã®ã
ãã©ã³ã¶ã¯ã·ã§ã³èšèš ïœ å®è£
æ¹åŒã®æ±ºå®ãããŒãã£ãŒãã以äžã«ç€ºãã
â»ãå€ããŒãžã§ã³æ³ãã®æ¹ããã£ã·ãžã§ã³ïŒå€æïŒãæµ
ããèšèšãããããšèšããã
WEBã®ãããªãDBMSãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšã§ããªãæ¹åŒã§ãUPãå®è£
ããïŒ
â
⣠YES â ã¿ã€ã ã¹ã¿ã³ãã䜿çšããããåŸãªãïŒæ¥œèгæ¹åŒïŒã
â
â NO â DBMSãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããããšãã§ããã
â
â â æä»æ¹åŒã«ã楜芳æ¹åŒãæ¡çšããïŒ
â
⣠YES â åé¢ã¬ãã«ãçŽååïŒSerializableïŒãèšå®ãããã©ã³ã¶ã¯ã·ã§ã³ã®ã³ãããæã«ç«¶åãšã©ãŒãæ€åºããïŒæ¥œèгæ¹åŒïŒã
â
â NO â æŽæ°åæã®èªã¿åãã«ãæç€ºçã«æŽæ°ããã¯ã䜿çšããããšã§ãäºåã«ç«¶åæ€åºããïŒæ²èгæ¹åŒïŒã
â»ãæŽæ°ããã¯ã®ç«¶åæãåŸ æ©ããããåŸ æ©ããªãããèšå®ããããšãã§ããïŒNOWAIT ãªãã·ã§ã³ïŒã
WEBã®ãããªãDBMSãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšã§ããªãæ¹åŒã§ãUPãå®è£
ããïŒ
â
⣠YES â ã¿ã€ã ã¹ã¿ã³ãã䜿çšããããåŸãªãã
â NO â DBMSãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããããšãã§ããã
â
â â DBMSãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšã§ãããDBã«è² è·ããããããªãïŒ
â
⣠YES â ã³ãããæžã¿èªã¿åãïŒRead CommittedïŒã«èšå®ããã¿ã€ã ã¹ã¿ã³ãã䜿çšããUPåŽã§å¶åŸ¡ããïŒæ¥œèгæ¹åŒïŒã
â NO â ç¹ã«åé¡ãç¡ãå Žåã¯ãDBMSãã©ã³ã¶ã¯ã·ã§ã³ã䜿çšããã
â
â â æä»æ¹åŒã«ã楜芳æ¹åŒãæ¡çšããïŒ
â
⣠YES â ã³ãããæžã¿èªã¿åãïŒRead CommittedïŒã§èšå®ãã
â ã¿ã€ã ã¹ã¿ã³ãã䜿çšããUPåŽã§åæå®è¡å¶åŸ¡ãããïŒæ¥œèгæ¹åŒïŒã
â
â NO â æ²èгæ¹åŒããç°¡åã«å®è£
ããïŒ
â
⣠YES â ç¹°ãè¿ãå¯èœèªã¿åãïŒRepeatable ReadïŒä»¥äžã®åé¢ã¬ãã«ãèšå®ããããšã§ã
â åç
§åŠçã®çµæã»ããã«å
±æããã¯ã®ããŒã«ãããã¯ãæããäºåã«ç«¶åæ€åºããã
â NO â ã³ãããæžã¿èªã¿åãïŒRead CommittedïŒä»¥äžã®åé¢ã¬ãã«ãèšå®ãã
æŽæ°åæã®èªã¿åãã«ãæç€ºçã«æŽæ°ããã¯ã䜿çšããããšã§ãäºåã«ç«¶åæ€åºããã
SQL Server ã§ã¯ãç¹°ãè¿ãå¯èœèªã¿åã(Repeatable Read) 以äžã®åé¢ã¬ãã«ã§ã
察象ããŒã¿ã«å
±æããã¯ãããŒã«ãã§æãããã
ãæŽæ°ããŒã¿ã®æ¶å€±ããé²ãããšãã§ããã ãã®æä»å¶åŸ¡ãå®çŸã§ããã
æŽæ°ããã¯ã«ã¯ããã®ãšãåé¡ãšããŠçºçãããããã»ããã¯ãé²ãããã«
䜿çšãããšãã芳ç¹ãããããã·ã¹ãã ã®ãŠãŒã¶ããã°ã©ã ãéçºããå Žåã«ã¯ã
åæå®è¡æ§ãé«ããããã«ãåé¢ã¬ãã«ã«ãã³ãããæžã¿èªã¿åã(Read Committed) ã®
èšå®ã§äžèЧãèªã¿åãïŒäžèЧç»é¢è¡šç€ºïŒãæŽæ°å¯Ÿè±¡ããŒã¿ã®èªã¿åãïŒè©³çްç»é¢è¡šç€ºïŒæã«ã
æç€ºçã«æŽæ°ããã¯ãæãããŒã¿ãèªã¿åããã¿ãŒã³ãå€ãã
è£è¶³ïŒWeb ã¢ããªã§ã®çŸå®è§£ïŒ: ãããŒãã£ãŒãã®æåã®åå²ã«ãããšããã
Web ã®ãããªã¹ããŒãã¬ã¹ãªæ¹åŒã§ã¯ç»é¢ããŸããã§ DB ãã©ã³ã¶ã¯ã·ã§ã³ã
ä¿æã§ããªããããæ²èŠ³ããã¯ã¯äºå®äžäœ¿ããªãã
ãã®ãããå®åã§ã¯æ¥œèгåæå®è¡å¶åŸ¡ãäž»æµã«ãªããSQL Server ã§ã¯
rowversionïŒtimestampïŒåãå®ç³ãALTER TABLE dbo.Orders ADD RowVer rowversion NOT NULL; -- æŽæ°æïŒèªã¿åãæç¹ã® RowVer ãæ¡ä»¶ã«å«ãã UPDATE dbo.Orders SET Amount = @amount WHERE OrderId = @id AND RowVer = @rowVerAtRead; IF @@ROWCOUNT = 0 THROW 50001, N'ä»ã®ãŠãŒã¶ã«ãã£ãп޿°ãããŠããŸãã', 1;Entity Framework ã§ã¯ããã®åã«
[Timestamp]屿§ã
ä»ããã ãã§åãå¶åŸ¡ãè¡ãããç«¶åæã¯
DbUpdateConcurrencyExceptionãçºçããã
SQL Server 2005 ããã¯ãå€ããŒãžã§ã³æ³ã䜿çšããã
åæå®è¡å¶åŸ¡ïŒMVCCïŒããµããŒããããããã«ãªã£ãŠããã
å€ããŒãžã§ã³æ³ã䜿çšãããåæå®è¡å¶åŸ¡ïŒMVCCïŒã䜿çšããã«ã¯ã次㮠2 ã€ã®æ¹æ³ãããã
READ_COMMITTED_SNAPSHOT ã¯ãOracle ã§ã®ããã©ã«ãã®åäœãšã»ãŒåãã§ããã
ã¹ããŒãã¡ã³ãçºè¡æç¹ã§ã®æ£ããããŒã¿ãåç
§ã§ããããšãä¿èšŒããã
ã¹ãããã·ã§ããåé¢ã¬ãã«ã¯ãOracle ã® Serializable ã®åé¢ã¬ãã«ã
éžæããå Žåãšã»ãŒåãåäœã§ããã
ãã©ã³ã¶ã¯ã·ã§ã³çºè¡æç¹ã§ã®æ£ããããŒã¿ãåç
§ã§ããããšãä¿èšŒããã
äžèšã®å€ããŒãžã§ã³æ³ã䜿çšãããåæå®è¡å¶åŸ¡ïŒMVCCïŒã¯ããã©ã«ãã§ã¯å©çšã§ããªãã
å©çšã®éã¯ãDBMS ãžäžèšã®èšå®ãå¿ èŠã«ãªãã
以äžã®ããã«ããŒã¿ããŒã¹ã«å¯Ÿã㊠READ_COMMITTED_SNAPSHOT ã ON ã«èšå®ããã
ALTER DATABASE ããŒã¿ããŒã¹å
SET READ_COMMITTED_SNAPSHOT ON以äžã®ããã«ããŒã¿ããŒã¹ã«å¯Ÿã㊠ALLOW_SNAPSHOT_ISOLATION ã ON ã«èšå®ããã
ALTER DATABASE ããŒã¿ããŒã¹å
SET ALLOW_SNAPSHOT_ISOLATION ON詳ããã¯ã以äžã®ããã¥ã¡ã³ããåç §ã®ããšã
- SQL Server 2005 Tips and Tips > 第2å æä»ããã¯ã«ãããã¯ãããªãèªã¿åãã®å®çŸ
è£è¶³ïŒRCSI ãš SNAPSHOT ã®éãïŒ: ååã䌌ãŠãããæ§è³ªãç°ãªãã
RCSI SNAPSHOT æå¹å SET READ_COMMITTED_SNAPSHOT ONSET ALLOW_SNAPSHOT_ISOLATION ONã¢ããªåŽã®å€æŽ äžèŠïŒæ¢å®ã® Read Committed ã®æåãå€ããïŒ å¿ èŠïŒ SET TRANSACTION ISOLATION LEVEL SNAPSHOTïŒäžè²«æ§ã®åäœ ã¹ããŒãã¡ã³ãéå§æç¹ ãã©ã³ã¶ã¯ã·ã§ã³éå§æç¹ æŽæ°ç«¶å çºçããªãïŒææ°ãããã¯åŸ ã¡ïŒ ãšã©ãŒ 3960 ãçºçããã æå¹åã®æ¡ä»¶ DB ãžã®æä»ã¢ã¯ã»ã¹ãå¿ èŠïŒå šæ¥ç¶ã®åæïŒ éåžžã¯äžèŠ RCSI ã®æå¹åã«ã¯ DB ãžã®æä»ã¢ã¯ã»ã¹ãå¿ èŠãªããã
皌åäžã®ã·ã¹ãã ã«åŸããå ¥ããå Žåã¯åæ¢æéã®èšç»ãèŠã
ïŒALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATEã䜵çšïŒã
- ããã¯æ³ãæ¢å®ã®ã¢ãŒããªã®ã§ããã¯æ³ã®æ¹ãå€ãæ°ãããŸããã
å€ããŒãžã§ã³æ³ã䜿ããªããšããæ å ±ãèããŸããã - æãäžã®äººã«ããã¯æ³ãšå€ããŒãžã§ã³æ³ã®ã©ã£ã¡ã«èªä¿¡ããã®ïŒ
ãšèããäºããããŸãããåçç¡ãã§ããïŒãŸããããããŸãã§ããïŒã
調ã¹ãŠã¿ãŸãããã以äžã®ãã¬ãŒãã»ãªããèæ ®ããŠäœ¿ãåããã°ã€ã€ã ãã®ããã§ãã
-
ããã¯æ³ãšå€ããŒãžã§ã³æ³ãæ¯èŒãããšãå€ããŒãžã§ã³æ³ã¯ã
- ããããã³ã°ããããããã¯ãçºçãé£ããªããã
- tempdb ã䜿çšããåŠçã®ãªãŒããããã倧ãããªãã
ãšããããšã®ããã§ãã
-
ã¡ãªã¿ã«ãããã©ã«ãã¯ã
- SQL Server ã§ã¯
READ_COMMITTED_SNAPSHOTãããã©ã«ãã§ OFF - SQL Azure ã§ã¯ã
READ_COMMITTED_SNAPSHOTãããã©ã«ãã§ ON
ã ããã§ãã
- SQL Server ã§ã¯
è£è¶³ïŒææ°åïŒçŸåšã®æšå¥šïŒ: ãAzure SQL Database ã§ã¯æ¢å®ã§ ONããšãã
äºå®ã¯ãMicrosoft èªèº«ã RCSI ãæ¢å®ãšããŠåŠ¥åœãšå€æããŠããããšãæå³ããã
çŸåšã¯ããªã³ãã¬ãã¹ã®æ°èŠæ§ç¯ã§ãRCSI ãæå¹ã«ããã®ã第äžåè£
ãšããäœçœ®ä»ãã«ãªã£ãŠãããçç±ã¯ä»¥äžã
- åç §åŠçãå ±æããã¯ãåããªããªãã
ãåç § Ã æŽæ°ãã®ããããã³ã°ãšãããããã¯ãæ¿æžããWITH (NOLOCK)ã䜿ãåæ©ããªããªãïŒåè¿°ã®ãšãã NOLOCK ã¯å±éºïŒ- ã¢ããªã±ãŒã·ã§ã³ã®ä¿®æ£ãäžèŠ
äžæ¹ã§ã³ã¹ããæ£ããçè§£ããŠããã
ã³ã¹ã å 容 tempdb ããŒãžã§ã³ ã¹ãã¢ã® I/O ãšå®¹éãé·æéãã©ã³ã¶ã¯ã·ã§ã³ã§è¥å€§åãã è¡ã®ãµã€ãº åè¡ã« 14 ãã€ãã®ããŒãžã§ã³æ å ±ãä»å ãããïŒååæŽæ°æã«å¢å ïŒ æŽæ°ç«¶å RCSI ã§ã¯çºçããªããããã¹ãã¢ããããŒãã¯äŸç¶ãšããŠèµ·ããããïŒæ¥œèгå¶åŸ¡ã¯å¥éå¿ èŠïŒ ç¹ã«ãRCSI ã«ããããæŽæ°ã®åæå®è¡å¶åŸ¡ãäžèŠã«ãªãããšãã誀解ã¯çŠç©ã
RCSI ã解決ããã®ã¯åç §ã®ããããã³ã°ã§ãã£ãŠãæŽæ°ã®ç«¶åã§ã¯ãªãã
ããŸãæ å ±ããããŸããã§ãããã以äžã®æ å ±ãéåžžã«åèã«ãªããŸããã
-
SQL Server ã®èªã¿åãäžè²«æ§ãšããã¯ïœã·ã¹ãã éçºã®ããã°ïœæ ªåŒäŒç€Ÿãã«ãœãã
https://bellsoft.jp/blog/system/detail_586 -
ãã©ã³ã¶ã¯ã·ã§ã³ ããã¯ãšè¡ã®ããŒãžã§ã³ç®¡çã¬ã€ã | Microsoft Learn
https://learn.microsoft.com/ja-jp/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide
ããç²åºŠã®äœãããã¯ãªãœãŒã¹ã«ããã¯ãä¿æããŠããããšã瀺ãããã®ããã¯ã
å
éšä»æ§ïŒå
éšã·ã¹ãã ïŒã§äœ¿çšããããããå€éšä»æ§ãšããŠæèããå¿
èŠã¯ç¡ãã
-
ããã¯ãããŒãžã£ã¯ãåã«äžã€ã®ããã¯ãªãœãŒã¹ã«å¯ŸããŠããã¯ãç²åŸã
äºææ§ã§å¶åŸ¡ããã ããªã®ã§ãã³ã¬ã ãã§ã¯ãããã¯ã®äºææ§ããã
ããŒãã«ã«å ±æããã¯ãããŠããŠããè¡ã«æä»ããã¯ããããŠ
æŽæ°ãããŠããŸãããšãããã -
ã€ã³ãã³ãããã¯ã¯ã³ã¬ãé²ããããæŽæ°æãè¡ã«æä»ããã¯ããããåã«ã
ããŒãã«ã«ã€ã³ãã³ãæä»ããã¯ããããããšããã
ãã®å ŽåãããŒãã«ã«å ±æããã¯ãããã£ãŠããã°ã
è¡ã«æä»ããã¯ã®åã®ãããŒãã«ã«ã€ã³ãã³ãæä»ããã¯ããããæ®µéã§å€±æããã -
åè
- ã€ã³ãã³ãããã¯ãšã¯ïŒ â Microsoft SQL Server Japan Support Team Blog
https://learn.microsoft.com/ja-jp/archive/blogs/jpsql/
- ã€ã³ãã³ãããã¯ãšã¯ïŒ â Microsoft SQL Server Japan Support Team Blog
ç§»è¡ã¡ã¢ïŒèª€åïŒ: å ããŒãžã®ãæä»ããã¯ãæžããŠãã¯
ãæä»ããã¯ããããŠãã®èª€èšã
è£è¶³ïŒæèããå Žé¢ã¯ããïŒ: ãå€éšä»æ§ãšããŠæèããå¿ èŠã¯ç¡ãããšãããã
é害解ææã«ã¯å¿ ãç®ã«ããã
sys.dm_tran_locksã®request_modeã«çŸãã
IS/IX/SIXãã€ã³ãã³ã ããã¯ã§ã
resource_type = 'OBJECT'ã®è¡ã«ä»ãã
ããŒãã« ããã¯ïŒS/XïŒãèŠããã
ãã㯠ãšã¹ã«ã¬ãŒã·ã§ã³ãçãããšããèªã¿æ¹ããã
ïŒSQL Server ã®ããã¯ã®ãšã¹ã«ã¬ãŒã·ã§ã³ïŒã
- SQL Server ã§ã®ããã¯ã»ã¿ã€ã ã¢ãŠã
- SQL Server ã®ããã¯ã®ãšã¹ã«ã¬ãŒã·ã§ã³
- SQL Server ã§ã®ãããããã¯
Tags: ç§»è¡, ããŒã¿ã¢ã¯ã»ã¹, SQL Server, ADO.NET