一些说明

  1. jdbcTemplate.batchUpdate方法(5种传参)本身是没有事务的,当没有加@Transactional时,传入的多条sql各自独立,处理失败的不会导致其它处理成功的回滚。TODO 这里有点歧义,处理失败时,需不需要手工回滚?

  2. 实用的MySQL jdbc URL参数:

useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

说明:

参数 说明
serverTimezone 时区,建议设置,在spring高版本中,GMT时区有歧义
characterEncoding 客户端的编码,建议设置,默认是取自数据库的编码
zeroDateTimeBehavior=convertToNull 当数据库的日期是0000-00-00时,转换成null
  1. @Transactional的事务传播特性常用用法

1)默认的情况下,如果一个方法注解了@Transactional,当执行到该方法时,如果还没有启动事务,则启动一个事务,该方法的执行的sql都在该事务中;如果外层方法已经启动了事务,则使用已存在的这个事务。

2)假如有一个方法A,它可能被一个注解了@Transactional的方法调用,也可能没有,但无论哪种情况,假如我们都不想让方法A在事务中执行(例如日志场景,我们往db写log记录,就不希望这条log记录因为程序异常被回滚掉,这样日志就看不到了)。此时,只需要在方法A上加上@Transactional并设置隔离级别为:propagation = Propagation.NOT_SUPPORTED即可。

文档更新时间: 2020-12-21 09:48   作者:nick