使用数据库的Update锁机制处理并发 多线程
2015-05-11 13:49
351 查看
之前在公司做一个定时任务,任务本身的逻辑难度一般,但是我们生产环境是4台服务器集群的,测试环境也是2台服务器集成,那么对于JOB来说就会面临一个问题,
假如你的JOB是每天凌晨2.30跑,那么同一时间4台服务器都会去执行这个JOB,如果对同一个数据进行update操作就会发生脏读了。 处理这个问题可以用数据库的update 锁来解决, 因为我们知道update之后 会返回更新的条数 ,所以我们用一个标示状态来表示目前有台服务器在执行JOB了
如 标示用 flag表示 默认 为N 没有JOB执行 , 第一个服务器进入JOB 把这个标示给更新成 Y 那么会成功返回update条数 1 ,其他的三台机器则会update条数为0所以 if判断一下就好,然后在正常执行完和异常代码块里都还原一下 就是把 Y 改成N 代码贴上:
备注: 这个需要创建一个 配置参数表, id key value 足以
假如你的JOB是每天凌晨2.30跑,那么同一时间4台服务器都会去执行这个JOB,如果对同一个数据进行update操作就会发生脏读了。 处理这个问题可以用数据库的update 锁来解决, 因为我们知道update之后 会返回更新的条数 ,所以我们用一个标示状态来表示目前有台服务器在执行JOB了
如 标示用 flag表示 默认 为N 没有JOB执行 , 第一个服务器进入JOB 把这个标示给更新成 Y 那么会成功返回update条数 1 ,其他的三台机器则会update条数为0所以 if判断一下就好,然后在正常执行完和异常代码块里都还原一下 就是把 Y 改成N 代码贴上:
@Override public String executeMsgBoardScheduleAndRemindDisableJobByAdmin(List<BussinessDTO> list) { String message = " 留言板排班"; boolean isGetLock = false; try { // N为目前没人执行 Y表示已经在执行 如果 N 能改为Y 证明目前没人执行。 默认执行完都会改为N // 将N改为Y 如果修改条数大于0说明成功, 目前没人 int updatedCount = commSysParamService.updateParamValueByParamKey(SystemConstant.MESSAGE_SCHEDULE_QUARTZ_IS_STARTED, SystemConstant.NO, SystemConstant.YES, null); boolean isQuartzStarted = (updatedCount <= 0); if (isQuartzStarted) { message = "已在执行,无法重执行!"; logger.info("executeMsgBoardScheduleAndRemindJob: " + message); return message; } else { isGetLock = true; } StopWatch watch = new StopWatch(); watch.start(); logger.info("executeMsgBoardScheduleAndRemindJob: 任务开始"); //处理完等待5分钟, 防止其他服务器重复执行 Thread.sleep(5 * 60 * 1000); watch.stop(); logger.info("executeMsgBoardScheduleAndRemindJob: 任务完成, 执行花费时间为:" + watch.getTime()); } catch (Exception e) { message = "执行发生异常!执行失败!请联系管理员!"; logger.error("executeMsgBoardScheduleAndRemindDisableJob: " + message, e); } finally { // 所有任务执行完毕后打开开关让下次可以进入执行 try { if(isGetLock) { commSysParamService.updateParamValueByParamKey(SystemConstant.MESSAGE_SCHEDULE_QUARTZ_IS_STARTED, SystemConstant.YES, SystemConstant.NO, null); } } catch (BusinessServiceException e) { logger.error("executeMsgBoardScheduleAndRemindJob: 重置MESSAGE_SCHEDULE_QUARTZ_IS_STARTED 失败", e); } } return message; }
备注: 这个需要创建一个 配置参数表, id key value 足以
相关文章推荐
- web策略类游戏开发(三) 多线程下数据库并发更新的处理
- 使用dbproxy来处理高并发数据库请求
- C# 多线程并发处理数据库数据,发送信号等待处理完统一插入.(转)
- 单服务器架构下的多线程下数据库并发更新的处理方案
- web策略类游戏开发(三) 多线程下数据库并发更新的处理
- C# 多线程并发处理数据库数据,发送信号等待处理完统一插入.
- Android开发(12)--多线程处理机制之Handler的使用方法
- Android开发(12)--多线程处理机制之Handler的使用方法
- Android多线程及异步任务消息处理机制(一)--Handler的使用
- C# 多线程并发处理数据库数据,发送信号等待处理完统一插入
- 多线程并发处理的新思路:Parallel的使用
- C#使用多线程进行并发处理
- Android Bitmap大量使用不产生OOM之多线程并发加载Bitmap的处理方式
- 如何处理大量数据并发操作(数据库锁机制详解)
- Android多线程消息处理机制(四) Message、MessageQueue源码解析和Handler综合使用
- 如何处理大量数据并发操作(数据库锁机制详解)
- 总结:如何使用redis缓存加索引处理数据库百万级并发
- 总结:如何使用redis缓存加索引处理数据库百万级并发
- Android SQLite数据库(事务)的使用,多线程CRUD并发操作(可用于实际开发)
- 总结:如何使用redis缓存加索引处理数据库百万级并发