2011-10-09 32 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的评论,我必须这样做。我也尝试删除其中的一个。但如果我这样做,我会得到一个错误,说明我没有锁定该表。 我也设置所有的锁作为写入无济于事...... –