暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB For Update支持外连接

原创 MogDB 2024-08-06
86

可获得性

本特性自MogDB 5.0.0版本开始引入。

特性简介

本特性主要支持对外连接(left join, right join, full join)中的Null侧表进行加锁,如果NULL侧表对应行为NULL,则不加锁。

客户价值

适配支持For Update对外连接进行加锁。

特性描述

通常情况下,Select语句不会对数据加锁,查询过程不会对其他DML和DDL操作产生影响。而日常应用中,经常会遇到业务层面需要独占数据的场景,例如火车订票场景,屏幕显示有票,如果查询过程中不加锁独占数据,真正出票时,该数据可能已经被其他客户端修改,无票可出。这时需要在查询过程中对数据加锁,独占数据,确保不被其他数据修改。

For update是一种行级锁,一旦用户对某个行进行了行级加锁,则该用户可以查询也可以更新加锁的数据行,其他用户只能查询不能修改,直到该行数据被放锁为止。因此select…for update语句通常用来对查询语句进行手工加锁。本特性支持for update对外连接的NULL侧进行加锁。

示例

-- 创建表 CREATE TABLE tt01 (a INT, b INT); CREATE TABLE tt02 (a INT, b INT); -- 1)对内连接的两个表进行加锁,加锁成功,该事务结束前其他事务不能修改。 -- 事务1: SELECT * FROM tt01 INNER JOIN tt02 ON tt01.a = tt02.a FOR UPDATE; -- 事务2: UPDATE tt02 SET b = 200 WHERE a = 2; -- 对左连接的两个表进行加锁,加锁成功,该事务结束前其他事务不能修改。 -- 事务1: SELECT * FROM tt01 LEFT JOIN tt02 ON tt01.a = tt02.a FOR UPDATE; -- 事务2: UPDATE tt02 SET b = 200 WHERE a = 2; -- 对右连接的两个表进行加锁,加锁成功,该事务结束前其他事务不能修改。 -- 事务1: SELECT * FROM tt01 RIGHT JOIN tt02 ON tt01.a = tt02.a FOR UPDATE; -- 事务2: UPDATE tt01 SET b = 200 WHERE a = 2; -- 对全连接的两个表进行加锁,加锁成功,该事务结束前其他事务不能修改。 -- 事务1: SELECT * FROM tt01 FULL JOIN tt02 ON tt01.a = tt02.a FOR UPDATE; -- 事务2: UPDATE tt01 SET b = 200 WHERE a = 2;
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论