Mybaits/MybatisPlus做行锁

whdahanh 发布于 2024-03-02 1557 次阅读


方法一

@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 查询时加上数据行的排它锁,并在需要的时候释放锁。



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-03-02