mybatis操作mysql执行lock tables不生效
时间: 2024-03-15 11:47:15 AIGC 浏览: 94
如果使用 MyBatis 执行 `LOCK TABLES` 操作,需要在 SQL 语句中直接编写 `LOCK TABLES` 语句,例如:
```xml
<update id="lockTable" parameterType="java.lang.String">
LOCK TABLES my_table WRITE
</update>
```
在执行 `LOCK TABLES` 操作之后,需要在 MySQL 中立即执行其他操作,否则 MySQL 会自动释放锁。例如:
```xml
<update id="lockAndInsert" parameterType="com.example.User">
LOCK TABLES my_table WRITE;
insert into my_table(id, name) values(#{id}, #{name});
UNLOCK TABLES;
</update>
```
如果以上方法仍然无法生效,可能是因为 MySQL 的 `autocommit` 参数设置为 `1`。在这种情况下,MySQL 会在每个 SQL 语句执行完成之后自动提交事务,从而导致 `LOCK TABLES` 失效。解决方法是在 MyBatis 的数据源配置中设置 `autoCommit=false`,例如:
```xml
<dataSource type="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/my_database"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
<property name="initialSize" value="1"/>
<property name="maxActive" value="20"/>
<property name="autoCommit" value="false"/>
</dataSource>
```
设置了 `autoCommit=false` 之后,MyBatis 会在执行 `LOCK TABLES` 之后开启一个事务,直到 `UNLOCK TABLES` 语句执行完成之后才提交事务。
阅读全文
相关推荐



















