• 第九章 spring 事务和定时任务


    1. spring事务

    1.1 是什么?

            单个逻辑单元执行一系列的事;

            spring事务的本质就是对数据库事务的支持。

    1.2 目的

            为了保证数据的完整性和一致性;事务包含一系列的动作,一旦其中有一个动作出现错误,就全部进行回滚,将已完成的操作撤销。

    1.3 spring事务特性

    spring事务管理策略类继承自:org.springframework.transaction.PlatformTransactionManager

    这个接口;

     在TransactionDefinition接口中定义了一下特性:

            事务隔离级别;

            事务传播行为;

            事务超时;

            事务只读属性;

            spring事务回滚规则;

    1.4 声明式事务管理配置的两种方式(以mybatis为例) 

    1.4.1 xml配置文件的方式

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    7. <context:component-scan base-package="com.service"/>
    8. <context:property-placeholder location="classpath:db.properties"/>
    9. <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    10. <property name="driverClassName" value="${jdbc.driver}"/>
    11. <property name="url" value="${jdbc.url}"/>
    12. <property name="username" value="${jdbc.user}"/>
    13. <property name="password" value="${jdbc.password}"/>
    14. bean>
    15. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    16. <property name="dataSource" ref="ds"/>
    17. <property name="typeAliasesPackage" value="com.entity"/>
    18. <property name="configLocation" value="classpath:mybatis-config.xml"/>
    19. bean>
    20. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    21. <property name="basePackage" value="com.mapper"/>
    22. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    23. bean>
    24. <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    25. <property name="dataSource" ref="ds"/>
    26. bean>
    27. <tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager">
    28. <tx:attributes>
    29. <tx:method name="insert*" propagation="REQUIRES_NEW" rollback-for="java.lang.ArithmeticException"/>
    30. tx:attributes>
    31. tx:advice>
    32. <aop:config proxy-target-class="true">
    33. <aop:pointcut id="pc" expression="execution(* com.service.impl.*.*(..))"/>
    34. <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    35. aop:config>
    36. beans>

    1.4.2 注解方式

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    7. <context:component-scan base-package="com.service"/>
    8. <context:property-placeholder location="classpath:db.properties"/>
    9. <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    10. <property name="driverClassName" value="${jdbc.driver}"/>
    11. <property name="url" value="${jdbc.url}"/>
    12. <property name="username" value="${jdbc.user}"/>
    13. <property name="password" value="${jdbc.password}"/>
    14. bean>
    15. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    16. <property name="dataSource" ref="ds"/>
    17. <property name="typeAliasesPackage" value="com.entity"/>
    18. <property name="configLocation" value="classpath:mybatis-config.xml"/>
    19. bean>
    20. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    21. <property name="basePackage" value="com.mapper"/>
    22. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    23. bean>
    24. <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    25. <property name="dataSource" ref="ds"/>
    26. bean>
    27. <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
    28. beans>

    在事务管理的类或者方法上添加注解 @Transactional

    1. @Service
    2. public class RoleServiceImpl implements IRoleService {
    3. @Resource
    4. private RoleMapper roleMapper;
    5. @Resource
    6. private IDeptService deptService;
    7. @Override
    8. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    9. public int insertRole(Role role) {
    10. Integer count = roleMapper.insertRole(role);
    11. deptService.insertDept(new Dept("d5"));
    12. return count;
    13. }
    14. }

    在类上使用时,类中所有的public方法都将使用事务;若类中某个方法不想使用事务,则可以使用:@Transactional(propagation = Propagation.NOT_SUPPORTED)

    1.5 事务的传播性

    ① @Transactional(propagation=Propagation.REQUIRED):默认级别;特点:上下文中存在事务,就加入该事务中执行,不存在事务就新建事务执行;

    ② @Transactional(propagation=PROPAGATION.SUPPORTS):支持;特点:上下文中有事务就加入事务中执行,没有事务就用非事务的方式;

    ③  @Transactional(propagation=PROPAGATION.MANDATORY):强制;特点:上下文必须存在事务,否则抛出异常;

    ④  @Transactional(propagation=PROPAGATION.REQUIRES_NEW):要求新的;特点:每次都要新建一个事务,同时将上下文中的事务挂起,当新建事务执行完成后,再恢复执行;

    ⑤  @Transactional(propagation=PROPAGATION.NOT_SUPPORTED) :不支持;特点:上下文中存在事务则挂起事务,执行当前逻辑,结束后恢复上下文事务;

    ⑥  @Transactional(propagation=PROPAGATION.NEVER):无事务;特点:要求上下文中不能存在事务,有事务则抛出runtime异常,强制停止执行;

    ⑦  @Transactional(propagation=PROPAGATION.NESTED):嵌套级别;特点:上下文中存在事务则嵌套事务执行,不存在事务则新建事务。

     1.6 事务的隔离级别

    用于多事务并发执行时;

    ①   @Transactional(isolation = Isolation.SERIALIZABLE):事务串行执行;

    ②   @Transactional(isolation = Isolation.REPEATABLE_READ):保证事务不会修改由另一个事务读取但是未提交(回滚)的数据;

    ③   @Transactional(isolation = Isolation.READ_COMMITTED):大多主流数据库的默认事务级别,保证了一个事务不会读到另一个并行事务已经修改但未提交的数据;

    ④   @Transactional(isolation = Isolation.READ_UNCOMMITTED):保证读取过程中不会读取到非法数据。

     2. 定时任务

    spring相关的包+

    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-context-supportartifactId>
    4. <version>5.3.10version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.quartz-schedulergroupId>
    8. <artifactId>quartzartifactId>
    9. <version>2.3.2version>
    10. dependency>

    2.1 配置文件方式

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
    7. <context:component-scan base-package="com.service,com.advise,com.util"/>
    8. <task:scheduled-tasks>
    9. <task:scheduled ref="myTask" method="job1" cron="* * * * * *"/>
    10. task:scheduled-tasks>
    11. beans>
    1. @Component("myTask")
    2. public class TaskJob {
    3. public void job1(){
    4. System.out.println("rr!"+ LocalDateTime.now());
    5. }
    6. public void job2(){
    7. System.out.println("ww!"+LocalDateTime.now());
    8. }
    9. }

    2.2 使用注解方式

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
    7. <context:component-scan base-package="com.service,com.advise,com.util"/>
    8. <context:annotation-config/>
    9. <task:annotation-driven />
    10. beans>
    1. public class TaskJob {
    2. @Scheduled(cron = "3 1 * * * *")
    3. public void job1(){
    4. System.out.println("rr!"+ LocalDateTime.now());
    5. }
    6. @Scheduled(cron = "*/5 * * * * *")
    7. public void job2(){
    8. System.out.println("ww!"+LocalDateTime.now());
    9. }
    10. }

    2.3 cron表达式

    字段(按顺序,共6个)允许值允许的特殊字符
    0-59, - * /
    0-59, - * /
    小时0-23, - * /
    日期1-31, - * / ?  L  W  C
    月份1-12 或 JAN-DEC, - * /
    星期1-7 或 SUN-SAT, - * / ? L C #
    年(可选)留空  或  1970-2099, - * /

    特殊字符:

    , 列出枚举值

    - 区间

    * 通配

    /  起始时触发后,隔固定时间触发一次

    L 最后

    W 有效工作日(周一到周五)

    LW 连用  每月最后一个星期五

    # 确定每个月的第几个星期几

  • 相关阅读:
    SpringCloud Alibaba - 基于 FeignClient 整合 Sentinel,实现“线程隔离”和“熔断降级”
    yarn基本知识
    【微信小程序】一文解忧,事件绑定
    Spark-core面试知识点
    每日一问07——什么是Softmax回归?和线性回归的区别是什么?
    上海国际会展深入未来智能相机的发展趋势
    驱动定时器
    记一次问题排查
    一文看懂拉格朗日乘子法、KKT条件和对偶问题
    半导体行业如何在跨网数据交换时保证核心数据是安全的?
  • 原文地址:https://blog.csdn.net/m0_71674778/article/details/126870258