Я не могу заблокировать свою таблицу MySQL - PullRequest
2 голосов
/ 10 октября 2011

У меня (для меня) странная проблема.Я пытаюсь заблокировать набор таблиц для транзакции, которую я пытаюсь сделать.Но по какой-то причине по крайней мере одна из моих таблиц не блокируется.

Код, который у меня есть, выглядит следующим образом, пожалуйста, помните, что у меня проблемы только с блокировками, но все комментарии приветствуются:)

По какой-то причине 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;

Это задание для школы, так чтоВы знаете, мне бы очень хотелось понять, почему у меня такая проблема.

1 Ответ

1 голос
/ 10 октября 2011

из документации mysql о блокировке:

Если сеанс выдает инструкцию LOCK TABLES для получения блокировки, уже удерживая блокировки, существующие блокировки освобождаются неявно до предоставления новых блокировок. вы получаете двойную блокировку "ba_flight" по той же команде. Также, насколько я знаю, вы все равно не можете получить 2 блокировки записи для одной и той же таблицы.

Пожалуйста, попробуйте удалить дублирующиеся блокировки на той же таблице и повторите попытку.

Также вам лучше проверить эту документацию для блокировки внутренних транзакций для правильного способа блокировки таблиц.

...