A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

使用mysql的更新锁解决集群环境下重复调度的问题
如果应用程序有定时调度任务,在集群环境下,多个应用有多个调度任务。方法重复调度的情况出现。这时我们可以使用mysql的行锁来解决这个问题。
更新锁其实就可以看成排他锁的一种变形,只是它也允许其他人读。但不允许其他对这条数据的更新,删除操作,除非我释放了更新锁。下一个才能执行更新删除操作。
建表语句:
CREATE TABLE `log_table` (
  `SEQ_NAME` varchar(50) NOT NULL,
  `VERSION` smallint(6) NOT NULL DEFAULT '1',
  `REMARK` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`SEQ_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
实现思路可以利用log_table中的version做版本控制。当初始化version为1.
代码实现思路,
1.     从数据库找出表log_table中的version为1.
2.     使用mysql的更新锁,update log_table set version=version+1 where version=变量值 and seq_name=‘xxx‘(version=1)
3.     当更新语句执行成功返回更新行数,判断是否大于0.决定是否往下执行业务代码。
当集群应用同时执行第一步,取到version=1.当进行到第二步利用mysql的行锁控制,只要有一个应用程序执行第二步成功之后,集群的其他应用程序根据version=1 and seq_name=’xxxx’ 的条件就找不到相对应的数据.利用数据库的特性解决了重复调度问题。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马