可获得性
本特性自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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
MogDB 发布更新,解决 openGauss 数据库在长事务情况下Ustore表膨胀问题
MogDB
291次阅读
2025-04-17 10:41:41
MogDB 发布更新,解决 openGauss 数据库在长事务情况下Ustore表膨胀问题
云和恩墨
191次阅读
2025-04-16 09:52:02
【干货】磐维数据库-磐维删除分区数据测试
磐维数据库
64次阅读
2025-04-24 19:53:42
Oracle数据库常用脚本(八)
hongg
60次阅读
2025-04-02 09:09:23
“G”术时刻:资深工程师揭秘GBase数据库Hint核心技巧 实现SQL性能跃升
GBASE数据库
56次阅读
2025-04-25 10:10:28
MySQL数据库“干货”来袭!41个常用脚本,速来领取
青年数据库学习互助会
52次阅读
2025-03-31 10:03:01
MySQL数据库常用的41个脚本,速来下载!
小周的数据库进阶之路
46次阅读
2025-04-14 09:40:54
oracle锁
芃芃
45次阅读
2025-04-02 11:13:55
Oracle数据库常用脚本(六)
lh11811
45次阅读
2025-03-31 09:40:05
数据库SQL优化大总结之 百万级数据库优化方案
听溪
44次阅读
2025-04-01 20:55:52