文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

支持的版本:

其他版本:

For Update支持外连接

可获得性

本特性自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;
Copyright © 2011-2024 www.enmotech.com All rights reserved.