LOCK TABLE æ–‡

LOCK TABLEæ–‡ã?«ã‚ˆã‚Šæ˜Žç¤ºçš„ã?«ã€?表ã?«å…±æœ‰ã?‚ã‚‹ã?„ã?¯æŽ’ä»–ã?®ãƒ­ãƒƒã‚¯ã‚’ã?‹ã?‘ã‚‹ã?“ã?¨ã?Œã?§ã??ã?¾ã?™ã€‚ 表ã?¸ã?®ãƒ­ãƒƒã‚¯ã?¯ç?¾åœ¨ã?®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã?Œçµ‚了ã?™ã‚‹ã?¾ã?§ã?®é–“ã€?ç¶šã??ã?¾ã?™ã€‚

表をロックã?§ã??ã‚‹ã?®ã?¯ã€?データベースã?®æ‰€æœ‰è€…ã?¨è¡¨ã?®æ‰€æœ‰è€…ã?§ã?™ã€‚

明示的�表��ロック�次�場��便利��。
  • 表ã?®è¤‡æ•°è¡Œã?¸ã?®ãƒ­ãƒƒã‚¯ã?«ã‚ˆã‚‹ã‚ªãƒ¼ãƒ?ーヘッドをé?¿ã?‘る時。(言ã?„æ?›ã?ˆã‚Œã?°ãƒ¦ãƒ¼ã‚¶è‡ªã‚‰ã€?ロックエスカレーションを行ã?†æ™‚。)
  • デッドロックをé?¿ã?‘る時

ã?“ã?®æ–‡ã?§ã‚·ã‚¹ãƒ†ãƒ è¡¨ã?«ãƒ­ãƒƒã‚¯ã‚’ã?‹ã?‘ã‚‹ã?“ã?¨ã?¯ã?§ã??ã?¾ã?›ã‚“。

æ§‹æ–‡

LOCK TABLE 表å?? IN { SHARE | EXCLUSIVE } MODE

ã?„ã?šã‚Œã?®ãƒ¢ãƒ¼ãƒ‰ã?§ã?‚ã?£ã?¦ã‚‚ã€?トランザクションã?¯è¡¨ã‚’ロックã?—ã?Ÿå¾Œã€?ã??れ以上ã?®è¡Œã?”ã?¨ã?®ãƒ­ãƒƒã‚¯ã‚’å¾—ã‚‹ã?“ã?¨ã?¯ã?§ã??ã?¾ã?›ã‚“。例ã?ˆã?°ã€?情報を読むã?Ÿã‚?ã?«ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã?ŒFlightsã?¨ã?„ã?†è¡¨ã?®å…¨ä½“を共有モードã?§ãƒ­ãƒƒã‚¯ã?—ã?Ÿå¾Œã€?ã?‚ã‚‹æ–‡ã?«ã?¦è¡Œã‚’æ›´æ–°ã?™ã‚‹ã?Ÿã‚?ã?«ç‰¹å®šã?®è¡Œã?¸ã?®æŽ’他ロックを必è¦?ã?¨ã?—ã?Ÿã?¨ã?—ã?¾ã?™ã€‚ã?—ã?‹ã?—ã?ªã?Œã‚‰ã€?æ—¢ã?«Flights表ã?¸ã?®ãƒ­ãƒƒã‚¯ã?Œã?‚ã‚‹ã?Ÿã‚?ã€?排他ロックも表毎ã?¨ã?ªã‚‹å¿…è¦?ã?Œã?‚りã?¾ã?™ã€‚

ä»–ã?®æŽ¥ç¶šã?Œè¡¨ã?«å¯¾ã?—ã?¦æ—¢ã?«ãƒ­ãƒƒã‚¯ã‚’ã?‹ã?‘ã?¦ã?„ã‚‹ã?Ÿã‚?ã€?ã??ã?®è¡¨ã?¸ã?®ãƒ­ãƒƒã‚¯ã?Œå?–å¾—ã?§ã??ã?ªã?„å ´å?ˆã€?デッドロックã?®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ™‚é–“ã?ŒçµŒé?Žã?—ã?Ÿå¾Œã€?æ–‡ã?¸ã?®ä¾‹å¤–ã?Œç™ºç”Ÿã?—ã?¾ã?™ã€‚(SQLState X0X02)

例

行毎�ロック�多��発生�る��を��る���共有モード�Flights���表全体��ロックを行���以下�文を使���。
LOCK TABLE Flights IN SHARE MODE;
SELECT *
FROM Flights
WHERE orig_airport > 'OOO';
複数ã?®UPDATE文を発行ã?™ã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã?Œä¸€ã?¤ã?‚ã‚‹ã?¨ã?—ã?¾ã?™ã€‚ 個々ã?®æ–‡ã?¯ã‚?ã?šã?‹ã?ªè¡Œæ¯Žã?®ãƒ­ãƒƒã‚¯ã?—ã?‹å¿…è¦?ã?¨ã?—ã?ªã?„ã?®ã?§ã€?トランザクションã?¯ãƒ­ãƒƒã‚¯ã‚’表毎ã?«å¤‰æ›´ã?—ã?¾ã?›ã‚“。ã?—ã?‹ã?—UPDATEæ–‡ã?®æ•°ã?Œå¤šã?„ã?®ã?§ã€?å?–å¾—ã?¨é–‹æ”¾ã?Œè¡Œã‚?れるロックã?®å»¶ã?¹æ•°ã?¯å¤šã??ã?ªã‚Šã€?デッドロックã?«ã?ªã‚Šã?‹ã?­ã?¾ã?›ã‚“。 ã?“ã?®ã‚ˆã?†ã?ªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã?§ã?¯ã€?最åˆ?ã?«æŽ’他モードã?§è¡¨ã‚’ロックã?—ã?¾ã?™ã€‚ 例を以下ã?«ç¤ºã?—ã?¾ã?™ã€‚
LOCK TABLE FlightAvailability IN EXCLUSIVE MODE;
UPDATE FlightAvailability
SET economy_seats_taken = (economy_seats_taken + 2)
WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-03-31');

UPDATE FlightAvailability
SET economy_seats_taken = (economy_seats_taken + 2)
WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-04-11'); 

UPDATE FlightAvailability
SET economy_seats_taken = (economy_seats_taken + 2)
WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-04-12');

UPDATE FlightAvailability
SET economy_seats_taken = (economy_seats_taken + 2)
WHERE flight_id = 'AA1265' AND flight_date = DATE('2004-04-15');
トランザクションã?Œè¡¨ã‚’æ›´æ–°ã?™ã‚‹å‰?ã?«ã€?ã??ã?®è¡¨ã‚’ã?¿ã‚‹å¿…è¦?ã?Œã?‚ã‚‹å ´å?ˆã€?デッドロックをé?¿ã?‘ã‚‹ã?Ÿã‚?ã€?表ã?«æŽ’他ロックをã?‹ã?‘ã?¾ã?™ã€‚ 例:
LOCK TABLE Maps IN EXCLUSIVE MODE;
SELECT MAX(map_id) + 1 FROM Maps;
-- INSERT INTO Maps . . .