[英]I can't lock my MySQL table
我(對我)有一個奇怪的問題。 我試圖為我要執行的交易鎖定一組表。 但是由於某種原因,我的至少一張桌子不會鎖。
我的代碼如下所示,請記住,這只是我目前遇到問題的鎖,但是所有注釋都值得贊賞:)
由於某種原因,ba_flight不會被鎖定,或者這是我最常遇到的問題,但是,如果我僅調用:LOCK TABLES 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',
'haldir@gmail.com',
'+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;
這是學校的一項任務,以便您知道,我真的很想了解為什么會有這個問題。
從mysql文檔有關鎖定:
如果會話發出LOCK TABLES語句以在已經持有鎖的同時獲取鎖,則在授予新鎖之前隱式釋放其現有鎖。
您正在同一命令上獲得“ ba_flight”的雙重鎖定。 而且據我所知,您無論如何也無法在同一張表上獲得2個寫鎖。
請嘗試刪除同一表上重復的鎖,然后重試。
另外,您最好查看此文檔以了解鎖定事務內部的正確方法,以鎖定表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.