mybatis执行lock不生效
时间: 2023-07-24 14:33:45 浏览: 183
在 MyBatis 中进行锁定操作,需要在 SQL 语句中加上 `for update`(MySQL)或者 `for update nowait`(Oracle)等关键字,以及在 MyBatis 的 XML 配置文件中设置 `statement` 标签的 `resultSetType` 为 `FORWARD_ONLY`,`fetchSize` 为 `1`。例如:
```xml
<select id="selectForUpdate" parameterType="java.lang.Integer"
resultType="com.example.User" fetchSize="1" resultSetType="FORWARD_ONLY">
select * from user where id = #{id} for update
</select>
```
如果以上条件都满足,但是锁定仍然不生效,可能是因为数据库的隔离级别设置不正确。在 MySQL 中,隔离级别需要设置为 `serializable` 才能保证行级锁的生效。在 Oracle 中,需要设置为 `SERIALIZABLE` 或者 `READ COMMITTED`(需要使用 `nowait` 关键字)。
另外,在 MyBatis 3.4.0 之后的版本中,还可以使用 `@Select` 注解进行锁定操作,例如:
```java
@Select("select * from user where id = #{id} for update")
@ResultType(User.class)
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1)
User selectForUpdate(Integer id);
```
阅读全文