簡體   English   中英

我無法鎖定我的MySQL表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM