# [KB]关于 TiDB 的 SQL 查询报错 ERROR 1235 (42000)  function LOCK IN SHARE MODE has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions

## Description

SQL 查询报错 `ERROR 1235 (42000): function LOCK IN SHARE MODE has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions`

```sql
create table t(a int primary key);

select * from t lock in share mode;
ERROR 1235 (42000): function LOCK IN SHARE MODE has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions
```

## Root Cause

1. 根据官方文档[悲观事物模式](https://docs.pingcap.com/zh/tidb/stable/pessimistic-transaction/) 中描述：TiDB 不支持 SELECT LOCK IN SHARE MODE，使用这个语句执行的时候，效果和没有加锁是一样的，不会阻塞其他事务的读写。

2. 为了避免这一类问题，TiDB 在 v4.0.0 版本中引入了一个特有变量 [tidb_enable_noop_functions](https://docs.pingcap.com/zh/tidb/v5.0/system-variables/#tidb_enable_noop_functions-从-v40-版本开始引入) ，用于控制 noop function 的行为：默认情况下，一部分 noop function 的行为（如本例中的 SELECT LOCK IN SHARE MODE，[https://github.com/pingcap/tidb/pull/21005](https://github.com/pingcap/tidb/pull/21005) v4.0.9 版本）会被变更为报错。

3. 我们认为官方文档对于读锁的说明不足以引起重视，在某些情况下会给业务，尤其是上层应用程序带来一些误导（程序假定已经对数据加锁，但实际上并没有），这可能造成数据正确性的问题。

> **注意**
>  
> 如果之前是 \[v4.0.0,v4.0.8] 版本正常执行的 SQL，在升级到 v4.0.9 以上版本时会报错。

## Diagnostic Steps

1. 查看 SQL 报错为 ERROR 1235 (42000): function LOCK IN SHARE MODE has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions

2. 查看 SQL 变量 [tidb_enable_noop_functions](https://docs.pingcap.com/zh/tidb/v5.0/system-variables/#tidb_enable_noop_functions-从-v40-版本开始引入) 的值为 0
   
    ```sql
    select @@tidb_enable_noop_functions;
    +------------------------------+
    | @@tidb_enable_noop_functions |
    +------------------------------+
    | 0                            |
    +------------------------------+
    ```

3. 查看 TiDB 版本大于等于 v4.0.9

    ```sql
    select version();
    +--------------------+
    | version()          |
    +--------------------+
    | 5.7.25-TiDB-v4.0.9 |
    +--------------------+
    ```

## Resolution

报错是预期行为，在确认`LOCK IN SHARE MODE` 不会造成问题之后，设置 
`tidb_enable_noop_function = 1` 允许执行即可。

```sql
set @@tidb_enable_noop_functions=1;  --session 

set @@global.tidb_enable_noop_functions=1;  -- Global 级别，注意修改后，新 session 中生效
```

## Workaround

N/A

## Affect Version(optional)

v4.0.9,v4.0.10,v4.0.11,v4.0.12,v4.0.13,v4.0.14,v4.0.15,v4.0.16