Spring Schedule实现定时关闭订单
一、Spring Schedule&MySQL行锁表锁
1.1 描述
用于作业调度,如定时任务,非常轻量级, 对代码无侵入性,程序员可以注重业务的编写, 不需要关心如果构造Scheduler,但是调度任务被创建出来之后,不能动态更改任务执行周期,对于复杂的任务调度也具有一定的局限性
1.2 Cron表达式快速入门
Cron表达式的格式为:秒 分 时 日 月 周 年(可选)
字段名 | 允许值 | 允许特殊符号 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
月内日期 | 1-31 | , - * / L W C |
月 | 1-12或者JAN-DEC | , - * / |
周内日期 | 1-7或者SUN-SAT | , - * / L # C |
年(可选) | 留空,1970-2099 | , - * / |
意义 | |
---|---|
* | 匹配所有的值,在分钟的字段域里表示每分钟,类似于Linux的周期性任务 |
? | 只是在日期域喝星期域中使用,它被用来指定非明确值 |
- | 指定一个范围,在小时域里10-12表示10点、11点、12点 |
, | 指定几个可选值,如周内日期1,2,3表示星期一、星期二、星期三 |
/ | 指定增量,在秒域中0/15表示每分钟的0、15、30和45秒 |
L | 表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表示一个月的最后一天,如果在day-of-week域表示’7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如’6L’就表示一个月的最后一个星期五 |
W | 只允许日期域出现,这个字符用于指定日期的最近工作日,例如‘15W’表示这个月15号最近的工作日,如果15号是周六,则任务会在14号触发,如果15号刚好是周日,则任务会在周一也就是16号触发 |
LW | L和W可以在日期域中联合使用,LW表示这个月最后一周的工作日 |
# | 只允许在星期域中出现,这个字符用于指定本月的某某天。‘6#3’表示本月第三周的星期五,6表示星期五,3表示第三周,‘2#1’表示本月第一周的星期一 |
C | 允许在日期域和星期域出现。表达式的值依赖于相关的“日历”的计算结果。 |
1.3 Spring Schedule Cron生成器
[外链图片转存失败(img-t1NmXdCD-1567681483634)(F:\博客截图\cron表达式生成器.PNG)]
1.4 MySQL行锁与表锁
-
悲观锁
select … for update -
ROW-Level Lock(明确的主键)
select … for update在明确主键的时候会产生行锁Case1: 例如在proinfo表中,有id和name,id是主键 明确指定主键,并且有结果集,Row-Level Lock,产生行锁 select * from proinfo where id='441908080' for update Case2: 明确指定主键,但是没有结果集,则无所 select * from proinfo where id='-441908080' for update
-
Table-Level Lock(无明确的主键)
select … for update在明确主键的时候会产生表锁
Case1: 无主键,Tbale-Level Lock,产生表锁,会将整个表锁住 select * from proinfo where name='徐礼诚' for update Case2: 主键不明确,Table-Level Lock,产生表锁,会将整个表锁住 select * from proinfo where id<>'441908080' for update select * from proinfo where id like '441908080' for update