---
title: "锁定查询结果 LOCK IN SHARE MODE - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: 锁定查询结果 LOCK IN SHARE MODE SELECT ... LOCK IN SHARE MODE 用于在查询数据时获取共享锁，防止其他事务对数据进行写操作，但允许其他事务对数据进行读操作。即使用该语句时，会在读取的数据行上设置共享模式锁定，其他会话可以读取这些行，但在当前事务提交之前其他事务不能对其进行…
---
切换语言

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

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

# 锁定查询结果 LOCK IN SHARE MODE

更新时间：2026-04-09 14:13:41

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/300.develop/100.application-development-of-mysql-mode/500.read-data-of-mysql-mode/300.use-operators-and-functions-in-query-of-mysql-mode/1100.query-results-lock-in-share-mode.md)  

`SELECT ... LOCK IN SHARE MODE` 用于在查询数据时获取共享锁，防止其他事务对数据进行写操作，但允许其他事务对数据进行读操作。即使用该语句时，会在读取的数据行上设置共享模式锁定，其他会话可以读取这些行，但在当前事务提交之前其他事务不能对其进行修改。

#### 注意

OceanBase 数据库模拟了 `LOCK IN SHARE MODE` 共享锁语法的功能，使用写锁来实现，这样可以满足一些软件的兼容性需求，同时保证语法的正确性。由于使用写锁会使添加了 `LOCK IN SHARE MODE` 命令的读操作之间相互阻塞，因此一般不建议使用该语法，特别是在性能敏感的场景中更应该避免使用。

本文通过示例介绍如何使用 `SELECT ... LOCK IN SHARE MODE` 锁定查询结果。

## 示例

1. 在 **会话 1** 中，执行下面 SQL 语句开启事务。

   ```sql
   START TRANSACTION;

   ```
 2. 在 **会话 1** 中，使用 `LOCK IN SHARE MODE` 语法在表 `test_tbl1` 中对 `id` 值等于 `1` 的记录进行查询，并获取共享锁。

   ```sql
   SELECT * FROM test_tbl1 WHERE id = 1 LOCK IN SHARE MODE;

   ```

   返回结果如下：

   ```shell
   +------+------+
   | id   | name |
   +------+------+
   |    1 | A1   |
   +------+------+
   1 row in set

   ```
 3. 在 **会话 2** 中，执行下面 SQL 语句开启事务。

   ```
 4. 在 **会话 2** 中，执行下面 SQL 语句查询表 `test_tbl1` 中 `id` 值等于 `1` 的记录。

   ```sql
   SELECT * FROM test_tbl1 WHERE id = 1;

   ```

   返回结果如下：

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

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

   ```

   返回结果如下：

   ```shell
   ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

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

   ```sql
   COMMIT;

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

   ```

   返回结果如下：

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

   ```

## 相关文档

[SELECT](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004480787)

 上一篇 下一篇 ![有帮助](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) 咨询热线
