我正在尝试在表锁的情况下测试一个场景。
我试着像这样应用读写锁-
mysql> lock tables table_name write;
Query OK, 0 rows affected (0.01 sec)但在此之后能够写作-
mysql> insert into table_name (id) values (1000000023);
Query OK, 1 row affected (0.00 sec)读锁也不起作用。在应用锁之后,我能够成功地执行select查询。
当我们进行大量数据的表迁移时,当表上可能应用了写锁时,我需要测试我的应用程序行为(restful API)。因此,我猜,如果我能够通过命令行设置锁,它也将适用于我的API。我使用相同的用户登录到命令行,就像我在应用程序中登录mysql一样。
如果我遗漏了什么,请告诉我。
该表为InnoDb类型。
发布于 2019-08-12 22:39:01
我认为你误解了表锁定。根据documentation的说法
MySQL使客户端会话能够显式获取表锁,以便与其他会话合作访问表,或者防止其他会话在会话需要独占访问表时修改表。会话只能获取或释放其自身的锁。一个会话不能获取另一个会话的锁,也不能释放另一个会话持有的锁。
您基本上锁定了其他会话,使其不能写入到表中,但是您仍然可以在持有锁的同时写入该表。
对于您正在做的事情,文档页面中有一个example:
对事务性表(如InnoDB表)使用锁定表和解锁表的正确方法是,在开始事务时先设置autocommit =0(而不是START TRANSACTION),然后再使用锁定表,并且在显式提交事务之前不要调用解锁表。例如,如果您需要写入表t1并从表t2中读取,您可以这样做:
SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;当您调用锁表时,InnoDB在内部使用自己的表锁,而MySQL使用自己的表锁。InnoDB在下一次提交时释放它的内部表锁,但是为了让MySQL释放它的表锁,您必须调用UNLOCK TABLES。不应该使用autocommit = 1,因为InnoDB会在调用锁表之后立即释放其内部表锁,死锁很容易发生。如果autocommit = 1,则InnoDB根本不获取内部表锁,以帮助旧应用程序避免不必要的死锁。
https://stackoverflow.com/questions/57463230
复制相似问题