SpringSchedule - 定时任务简介

  • 然后我们还会讲一下Spring Schedule的一个配置,还有MYSQL的行锁和表锁,那我们现在来介绍一下Spring Schedule。一句话理解,用作作业调度,如定时任务,那JDK原生的呢,提供Timer,Task,这些类来完成定时任务,那开源框架还有Quarz。

  • 那么Spring Schedule Cron表达式呢,其实和 Quartz 的表达式是一样的,我们一起来看一下。首先第一个是秒,第二位是分,第三位是小时,第四位是日,第五位是月,第六位是周,第七位是年,年是可选的,那对于年来说,实际生产环境并不是太多,所以我们主要是把前六位弄明白,那如果前六位明白的话,那第七位的年,也很轻松理解的我们接着来看,现在对第五六七位的介绍,那我们看一下,关于这些字段允许的值,和允许的特殊字符。
  • 首先秒允许的值是0到59,运行的特殊字符是逗号,横线,星号和斜杠,那分和小时允许的特殊符号一样的,只不过小时是从0点到23点,月内日期是1到31,然后月大家看一下,1到12,或者英文,周内日期是1到7,年一般都留空,右侧的特殊符号第一次接触的时候也不用慌,我们现在来挨个解释一下,我们一起来看一下。

  • 首先是星号,代表匹配所有的值,那星号用处是最多的,第二个问号,只有在星期域和日期域中使用,他被用来指定非明确的值,那一会在我们实际项目中,使用的Cron表达式也会用到问号,横线是指定一个范围,如10-12,代表的是10点,11点,12点,前提是我们把10-12设置在小时域,逗号就是一个可选值,如星期一逗号,星期三逗号,星期五逗号,斜杠是比较重要的,这里表示指定的增量,如0/15,如果在秒域意思是,每分钟的0秒,15秒,30秒,45秒,那5/15在分钟域呢,所表示每小时的5分钟,20分钟,35分钟和50分钟,也就是说从第5分钟开始,增量15,然后就是20,再增量15就是35,再增量15就是50,然后我们经常能看到的写法,就是*/10,其实呢,*/10和0/10,是一样的,也就是初始值都是从0开始的,那对于星号问号,斜杠,我们实际工作当中,使用的是最多的,下面说一下L,表示day-of-month,和day-of-week域,但是这两个字段中的意思不同,例如day-of-month呢,所表示这个月的最后一天,那后边有一些例子,L我们实际用的不是太多,有兴趣的可以去查一下,然后我们继续来看。

  • 大家看到这么多表不要慌,一会把表达式的生成器一起来理解一下,W是只允许在日期域出现的,这个字符是指定日期的,最近工作日,W相对复杂一些,可以仔细看一下,然后我们看一下LW,L和W是可以在日期中联合使用的,LW表示这个月最后一周的工作日,井号是只允许在星期域中出现的,这个字符用于指定本月的某某天,而6#3表示本月第三周的星期五,那6就表示星期五,3表示第三周,毕竟Cron表达式是老外发明的,那星期日就作为一周的第一天,星期六作为一周的第七天,那第六天就是一周的星期五,所以4#5就代表第五周的星期三,然后C是允许在星期域和日期域中出现,我们这里面就不详细的介绍了。

  • 既然是关闭订单呢,我们这里就要牵扯到,MYSQL的行锁和表锁,我们会使用select * from .. for update,这种方式,其实for update是一种悲观锁,那后续演进我们也会演进成乐观锁的,大家可以从易到难,乐观锁在表中增加一个字段,然后它是一个version,version我们可以使用时间戳毫秒数,然后来进行一个判断,再决定这个值是否要更新,是否要回滚,那么for update呢,是一个悲观锁,但是虽说简单,还是有很多要注意的点,我们来看一下,首先我们要使用Innodb引擎,那在我们项目当中,都是使用的innodb引擎,然后继续看,for update在明确主键的时候,会产生行锁,如果主键不明确的话,会产生表锁,也是一个ROW-Level Lock,一个Table-Level的Lock。

  • 例如我们mmall_product表,有id和name,id是产品的主键,name是产品的名称,首先是明确指定主键,并且有结果集的,那就是行锁select * from mmall_product where id = '66' for update; 我们主要看where id,id是明确的主键,并且我们产品表里有这个产品,也就代表着有结果集,那么他会产生一个行锁。

  • 明确指定主键,并且没有结果集,我们查一个id是-100的,id也是主键,但是呢没有结果集,不会上锁,也就是无lock,select * from mmall_product where id = -100 for update。

  • 无主键看一下select * from mmall_product where name = 'phone' for update; name并不是主键,所以这个SQL语句会产生锁表,会把整个表锁住,所以我们在使用for update悲观锁的时候,这里一定是要注意的,如果一个不慎就会造成线上的故障。

  • 那主键不明确呢 select * from mmall_product where id <> 66 for update; 其实就是不等于,代表主键不明确,不等于66的主键,非常多,所以这个锁也会变成表锁,锁住整个表,那这个是主键不明确。

  • 然后再看一下,如果用id like,那主键也是不明确,所以还会变成表锁 select * from mmall_product where id like '66' for update。
发布了909 篇原创文章 · 获赞 1770 · 访问量 87万+

猜你喜欢

转载自blog.csdn.net/Dream_Weave/article/details/105266788