Mybatis Select...for update用法

Mybatis Select…for update用法

最近有需求批量处理大量数据,由于数据量很大,如果加分布式锁让一个线程跑需要太长时间,所以考虑集群中二十几台机器并行执行,每次取1000条数据处理。

选择了使用select…for update悲观锁,每次把取出来的1000条数据加锁之后更改状态字段再commit,从而保证所有线程不重复取数据。

很容易想到的用法就是把select for upate和之后的更新语句放在一个事务中:


SqlSession sqlSession = sqlSessionFactory.openSession(false);
		try{
   
			List<TestObject> records=sqlSession.selectList("testForUpdate"); //testForUpdate的sql语句为: select * from test_table where status='0' and rownum<1000 order by create_date desc for update
			if(records!=null && records.size>0){
   
           		 Map<String,Object> updateParam=new HashMap<>();
				updateParam.put("records", records);
				updateParam.put("status", "01");
				sqlSession.update("batchUpdate", updateParam);
            }
		}finally{
   
			sqlSession.commit(true);
			sqlSession.close();
		}
  • 首先开一个session,参数传false表示autocommit=false,不自动提交事务
  • 执行select for update
  • 更新取出来的数据
  • commit并且close session

commit的参数必须为true,这样在没有数据更新时也可以commit。否则commit时会判断一个isDirty的参数,这个参数只有在更新或者插入是会为true,如果不为true就不会commit,

sqlSession.commit(true)

具体的源码如下,我们传入的true就是这个force参数。

private boolean isCommitOrRollbackRequired(boolean force) {
   
        return !this.autoCommit && this<
  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值