方法一
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
Wrapper<TableDo > wrapper = Wrappers.<TableDo >query().lambda()
.eq(!CommUtil.isEmpty(id), TableDo ::getId, id)
.last("FOR UPDATE");
SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession();
// 业务操作
TableDo tableDo = tableMapper.selectOne(wrapper);
try {
tableMapper.updateById(tableDo)
sqlSession.commit(); // 释放所有锁
} catch (Exception e) {
sqlSession.rollback(); // 回滚事务,释放所有锁
}
方法二
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", 1).last("FOR UPDATE");
User user = userMapper.selectOne(queryWrapper);
System.out.println(user);
try {
// 业务操作
userMapper.updateById(user);
userMapper.update(user, queryWrapper);
sqlSession.commit(); // 释放所有锁
} catch (Exception e) {
sqlSession.rollback(); // 回滚事务,释放所有锁
}
在使用 MyBatis-Plus 查询时,也可以通过在 SQL 语句中添加 FOR UPDATE 子句来实现加上数据行的排它锁。同样地,要释放锁需要执行 commit 或 rollback 操作,这样会自动释放所有的锁。
这里调用 updateById() 或 update() 方法执行业务操作,然后调用 commit() 方法提交事务,释放所有锁。如果操作出现异常,则调用 rollback() 方法回滚事务,同时也会释放所有锁。
关闭 SqlSession
最后需要记得关闭 SqlSession 对象,释放资源。
这样就可以使用 MyBatis-Plus 查询时加上数据行的排它锁,并在需要的时候释放锁。
微信扫描下方的二维码阅读本文

Comments NOTHING