此查询序列有效:
LOCK TABLES order_product WRITE, product READ;
UPDATE order_product
SET order_product.quantity = order_product.quantity + 1;
这个查询(没有LOCK TABLES)也可以工作:
UPDATE order_product
INNER JOIN product ON order_product.product_id = product.id
SET order_product.quantity = order_product.quantity + 1;
但是此查询序列失败并出现错误:
LOCK TABLES order_product WRITE, product READ;
UPDATE order_product
INNER JOIN product ON order_product.product_id = product.id
SET order_product.quantity = order_product.quantity + 1;
错误:
#1100 - Table 'order_product' was not locked with LOCK TABLES
为什么将LOCK TABLES,UPDATE和INNER JOIN结合使用会导致此错误?
起初,我认为我的问题是在a similar SO answer中解决的,但是我无法想象我将使用表别名来解决该问题的查询会有所不同。
我找到的最接近的信息来自a answer on DBA stack exchange,但是该解决方案对我而言不起作用,并且谈话变得有些烦人。
更重要的是,如何构造查询以确保查询不会失败?在我的示例中,我以最小化查询的有效性为代价,将查询简化为尽可能易于理解,但是我想要原子性的锁和WHERE子句的连接。
在具有InnoDB表的MariaDB 10.1.36中进行了观察。