使用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’ 的条件就找不到相对应的数据.利用数据库的特性解决了重复调度问题。
|