---
title: github-fill
description: 锁定查询结果 SELECT FOR UPDATE OceanBase 数据库支持多版本并发控制 MVCC。默认情况下，读事务不会阻塞写事务的执行，但可以通过 SELECT ... FOR UPDATE 的方式为读事务的对象加锁，从而达到阻塞写事务的目的。 本文通过具体示例介绍如何使用 SELECT FOR UPDAT…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.5.0

# 锁定查询结果 SELECT FOR UPDATE

更新时间：2026-03-21 12:54:30

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/300.develop/200.application-development-of-oracle-mode/500.read-data-of-oracle-mode/300.use-operators-and-functions-in-query-of-oracle-mode/1000.lock-query-result-select-for-update-of-oracle-mode.md)  

OceanBase 数据库支持多版本并发控制 MVCC。默认情况下，读事务不会阻塞写事务的执行，但可以通过 `SELECT ... FOR UPDATE` 的方式为读事务的对象加锁，从而达到阻塞写事务的目的。

本文通过具体示例介绍如何使用 `SELECT FOR UPDATE` 锁定查询结果。

## 示例

使用 `SELECT FOR UPDATE` 锁定查询结果。

1. 创建示例表并录入合适的数据。

      1. 执行下面 SQL 语句，创建 `test_tbl1` 表。

        ```sql
        CREATE TABLE test_tbl1(id number,
           name VARCHAR(18),
           c_date date,
           PRIMARY KEY (id)
           );

        ```
      2. 执行下面 SQL 语句，在 `test_tbl1` 表中插入数据。

        ```sql
        INSERT INTO test_tbl1 VALUES(1,'A1',date'2019-09-09'),
           (2,'B1',date'2019-06-06'),
           (3,'C1',date'2019-05-05'),
           (4,'D1',date'2020-02-02'),
           (5,'F1',date'2021-01-01');

        ```
      3. 执行下面 SQL 语句提交事务。

        ```sql
        COMMIT;

        ```
 2. 在 **会话 1** 中，使用 `FOR UPDATE` 语法在表 `test_tbl1` 中对 `id` 值等于 `1` 的记录进行查询并添加行锁，所有并发的更新都会被阻塞并等待。

   ```sql
   SELECT name,c_date FROM test_tbl1 WHERE id = 1 FOR UPDATE;

   ```

   返回结果如下：

   ```shell
   +------+-----------+
   | NAME | C_DATE    |
   +------+-----------+
   | A1   | 09-SEP-19 |
   +------+-----------+
   1 row in set

   ```
 3. 在 **会话 2** 中，执行下面 SQL 语句在表 `test_tbl1` 中 `id` 值等于 `1` 的行对应的 `name` 的改为 `A1A1`。该 SQL 语句会等待，直到 **会话 1** 的事务 `ROLLBACK` 或者 `COMMIT` 才得到执行。

   ```sql
   UPDATE test_tbl1 SET name = 'A1A1'  WHERE id = 1;

   ```

   返回结果如下：

   ```shell
   OBE-30006: resource busy; acquire with WAIT timeout expired

   ```
 4. 在 **会话 1** 中，执行下面 SQL 语句提交事务。

   ```
 5. 在 **会话 2** 中，再次执行 **步骤 3** 的更新语句。

   ```

   返回结果如下：

   ```shell
   Query OK, 1 row affected
   Rows matched: 1  Changed: 1  Warnings: 0

   ```
 6. 在 **会话 2** 中，执行下面 SQL 语句提交事务。

   ```
 7. 在 **会话 1** 中查询更新后的数据。

   ```sql
   SELECT name,c_date FROM test_tbl1 WHERE id = 1;

   ```

   返回结果如下：

   ```shell
   +------+-----------+
   | NAME | C_DATE    |
   +------+-----------+
   | A1A1 | 09-SEP-19 |
   +------+-----------+
   1 row in set

   ```

## 相关文档

[锁机制](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479416)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
