2011-10-09 72 views
2

我有一個(對我來說)奇怪的問題。我嘗試爲我正在嘗試執行的事務鎖定一組表。但出於某種原因,至少我的一張桌子不會鎖定。我無法鎖定我的MySQL表

我的代碼看起來是這樣的,請remeber這只是我與當前問題的鎖,但所有評論都讚賞:)

出於某種原因ba_flight犯規被鎖定或那的問題,我最常用的有,但是,如果我只是打電話: 鎖定表ba_flight它完全沒問題。

-- SESSION A 


-- Part 1 ba_flight 

-- UNLOCK TABLES; 
START TRANSACTION; 

LOCK TABLES ba_booking WRITE, 
      ba_paid_booking WRITE, 
      ba_passenger WRITE, 
      ba_contact WRITE, 
      ba_weekday_factor READ, 
      ba_plane READ, 
      ba_flight READ, 
      ba_flight AS ba_f READ, 
      ba_weekly_schedule AS ba_ws READ, 
      ba_weekly_schedule READ; 

-- ba_flight does not get locked 


-- 1: Create the booking. 
CALL new_booking(1, 6); 

SHOW ERRORS; 

COMMIT; 

SET @bid = get_uncomplete_booking(); 

SELECT id 
    FROM ba_booking 
WHERE contact_id IS NULL; 

SELECT @bid AS "BID"; 

INSERT INTO ba_passenger(booking_id, 
         ssn, 
         fname, 
         lname) 
VALUES (@bid, 
     12341234, 
     'Göran', 
     'Greenleaf'); 

INSERT INTO ba_passenger(booking_id, 
         ssn, 
         fname, 
         lname) 
VALUES (@bid, 
     12351235, 
     'Adam', 
     'Jönsson'); 

INSERT INTO ba_passenger(booking_id, 
         ssn, 
         fname, 
         lname) 
VALUES (@bid, 
     12361236, 
     'Niklas', 
     'of Gondor'); 

INSERT INTO ba_passenger(booking_id, 
         ssn, 
         fname, 
         lname) 
VALUES (@bid, 
     12371237, 
     'Erik', 
     'Grey'); 

INSERT INTO ba_passenger(booking_id, 
         ssn, 
         fname, 
         lname) 
VALUES (@bid, 
     12381238, 
     'Johan', 
     'Baggins'); 

INSERT INTO ba_passenger(booking_id, 
         ssn, 
         fname, 
         lname) 
VALUES (@bid, 
     12381238, 
     'Elof', 
     'Baggins'); 

-- IF THIS IS FALSE THEN WE HAVE SOMETHING STRANGE GOING ON 
-- WITH OUR BOOKING AND SHOULD ROLLBACK. 

SELECT check_booked_passengers(@bid); 

CALL new_contact(@bid, 
       'Göran', 
       'Greenleaf', 
       '[email protected]', 
       '+9973565677'); 

-- RETURNS TRUE IF BOOKING IS CORRECT 

SELECT is_correct_booking(@bid); 

COMMIT; 
UNLOCK TABLES; 

-- Part 3 

-- START TRANSACTION; 

LOCK TABLES ba_booking WRITE, 
      ba_paid_booking WRITE,    
      ba_passenger WRITE, 
      ba_flight WRITE, 
      ba_flight AS ba_f WRITE, 
      ba_contact WRITE, 
      ba_weekday_factor WRITE, 
      ba_weekly_schedule READ, 
      ba_weekly_schedule AS ba_ws READ, 
      ba_plane READ; 

CALL pay_booking(@bid, 987654331); 

COMMIT; 
UNLOCK TABLES; 

這是學校的分配只是爲了讓你知道我真的很想明白爲什麼我有這個問題。

+0

請用「功課」 – Cez

+0

將此代碼重新標記@ Marcus:謝謝..奇怪我已經出現了retag選項 – Cez

+0

您是否收到關於ba_flight沒有被鎖定的錯誤?如果是這樣,請添加詳細信息。另外,請提供表格的引擎類型 – Cez

回答

1
mysql documentation

有關鎖定:

如果會話發出LOCK TABLES語句獲取鎖,而已經持有鎖,其現有的鎖被釋放隱含被授予新的鎖之前。

您正在通過同一命令獲得「ba_flight」的雙重鎖定。另據我所知,無論如何你都無法在同一張表上獲得2個寫鎖。

請嘗試刪除同一張表上的重複鎖,然後重試。

此外,你最好檢查this documentation for locking inside transactions正確的方式來鎖定表。

+0

正在請求鎖作爲READ鎖。您必須鎖定每個使用的別名。從手冊:「你不能在同一個查詢中使用同一個名稱多次引用一個鎖定表,使用別名代替,併爲表和每個別名獲得一個單獨的鎖」 – Cez

+0

我剛剛注意到後面的WRITE鎖請求雖然:) ..但你可以請求多個WRITE鎖使用別名 – Cez

+0

謝謝你脆弱的答案。說實話,我並不真正瞭解你所得到的,但我對sql的瞭解卻非常有限。我猜你的意思是雙鎖: 「ba_flight READ」和「ba_flight AS ba_f READ」,但正如Cez的評論,我必須這樣做。我也嘗試刪除其中的一個。但如果我這樣做,我會得到一個錯誤,說明我沒有鎖定該表。 我也設置所有的鎖作爲寫入無濟於事...... –