例如,在交易中,
START TRANSACTION;
SELECT count(*) as count FROM `order` WHERE user_id = 25286 LOCK IN SHARE MODE;
INSERT INTO `order` (`id`, `user_id`, `product_id`) VALUES (NULL, '25286', '36296');
我们执行 SELECT LOCK IN SHARE MODE;
这个 SELECT
查询将在从属数据库上执行并锁定一行。
是吗 SELECT LOCK IN SHARE MODE
还要在主数据库上创建行锁定,以便插入查询不会在主数据库上运行?
1条答案
按热度按时间xvw2m8pv1#
否-锁定不会渗透到整个服务器。因此,从服务器上的显式锁基本上不会锁定主服务器中相应的表,反之亦然。
我们在本例中使用的一个简单的解决方法是将所有这些特定的锁定查询只指向主服务器。因此,无论哪个客户端会话正在运行,这些查询总是只在主服务器上运行。这样就可以处理并发连接问题。
我在php代码中做了类似的过滤。为了将查询定向到相关服务器(将查询读取到从属服务器,将查询写入主服务器),编写了一个自定义函数来标识查询的类型。
值得注意的一点是,事务/锁定/解锁操作中的查询始终被视为写查询。
另外,对于
Set
,仅限SET AUTOCOMMIT
以及SET TRANSACTION
是写命令。请在下面找到我们正在使用的实际代码的大致精简版本: