spring事务
概述
spring将Java Transaction API (JTA), JDBC, Hibernate, 和Java Persistence API (JPA)这些不同的事务api抽象成了统一的编程模型,其中TransactionManager作为spring事务的顶级接口负责声明一个事务管理器,PlatformTransactionManager则继承了该接口提供了事务的获取、提交、回滚的基本声明,通常我们可以通过编程式和声明式这两种方式来编写我们的事务代码,编程式事务通常是利用事务管理器来手动获取事务最后提交或者回滚,而声明式事务则是最为常见的使用方式,也就是我们在方法或类上标注的@Transactional
注解。
MySql时区对时间字段的影响
概念
MySQL Server维护几个时区变量
系统时区
mysql在启动时会获取目标机器上的时区值作为全局变量system_time_zone的值,此后该值不变。如果是通过mysqld_safe命令来启动的可以通过–timezone在启动时设置该值
mysql当前运行时区
全局变量time_zone代表了mysql服务器的当前正在运行的时区,time_zone的初始值为’SYSTEM’,代表当前时区值为system_time_zone,可以在启动mysql时通过–default-time-zone设置该值,或者在mysql配置文件中配置default-time-zone=’timezone’
会话时区
每个客户端连接都能设置自己的时区,可以通过会话参数time_zone设置(SET time_zone = timezone;)每个会话的初始时区值是从全局变量time_zone中获取的,即每次会话的默认时区值为全局变量time_zone值。
注意会话时区的改变会影响NOW()或CURTIME()的返回值,同时对于那些类型为TIMESTAMP的字段,会将会话时区转换为utc时区存储到表中以及将utc时区转换到会话时区展示。不过对于date、time、datetime类型字段的查询没有任何影响。
MySql的事务机制
ScheduledThreadPoolExecutor原理
概述
ScheduledThreadPoolExecutor提供了在给定的延迟时间之后或者以固定的速率执行任务的机制,也就是我们平时所说的任务调度。ScheduledThreadPoolExecutor本身是继承了ThreadPoolExecutor,与ThreadPoolExecutor不同的是它屏蔽了对maximumPoolSize的支持,仅仅使用corePoolSize作为固定大小线程池,其内部是通过一个以数组实现的最小堆无界队列来保存那些被调度的任务,执行这些任务的线程只能是核心线程,也就是说当我们有2个耗时为2秒的周期任务需要每隔2s需要执行一次的话,如果核心线程数为1,那么其中一个任务必须等待另外一个任务执行完毕才有可能执行。