当前位置: 首页 > news >正文

spring系列 事务

Spring事务作用

在数据层或业务层加一层保障,使得一系列对数据库的操作同成功同失败。

用法:

在业务层接口上添加Spring事务管理注解@Transactional

public interface AccountService {    

        @Transactional    

        public void transfer(String out,String in ,Double money);

}

一般不会添加到业务层实现类中,降低耦合。

除了添加到方法上,还可以添加到接口上表示当前接口所有方法开启事务。

开启注解式事务驱动

@Configuration @ComponentScan("com.itheima") @PropertySource("classpath:jdbc.properties") @Import({JdbcConfig.class,MybatisConfig.class})

@EnableTransactionManagement

public class SpringConfig {

}

注入事务管理器

这一步可以写到Config类中

@Bean

public PlatformTransactionManager transactionManager(DataSource dataSource){

        DataSourceTransactionManager ptm = new DataSourceTransactionManager();

        ptm.setDataSource(dataSource);

        return ptm;

}

spring的设计

原本的操作数据库的方法,每一个自己都会单独开启一个事务,失败会回滚自己的部分,但spring逻辑上使得所有操作都在一个事务里,同成功同失败。

spring发起事务的方法叫做事务管理员,加入进来的方法都叫事务协调员(可以是数据层还可以是业务层,都算,只是个逻辑角色)

@Transactional的属性

readOnly                               设置是否为只读事务    readOnly=true 只读事务
timeout                                  设置事务超时时间    timeout = -1(永不超时)
rollbackFor                            设置事务回滚异常(class)    rollbackFor = {NullPointException.class}
rollbackForClassName          设置事务回滚异常(String)    同上格式为字符串
noRollbackFor                       设置事务不回滚异常(class)    noRollbackFor = {NullPointException.class}
noRollbackForClassName    设置事务不回滚异常(String)    同上格式为字符串
propagation                           设置事务传播行为    ……

使用场景如:

spring默认只回滚error和运行时异常,当出现其他异常如:IO异常,这种时候要将其配置到注解属性中,才会回滚。如:@Transactional(rollbackFor = IOException.class)

事务传播行为:

REQUIRED(默认)            开启T            加入T
无    新建T2
REQUIRES_NEW                开启T            新建一个T
无    新建T2
SUPPORTS                         开启T             加入T
无    无
NOT_SUPPORTED             开启T             无
无    无
MANDATORY                       开启T            加入T
无    ERROR
NEVER                                 开启T            ERROR
无    无
NESTED                              设置savePoint,一旦事务回滚,事务将回滚到savePoint处,交由客户响应提交/回滚

需求是不管代码出不出问题,我们的日志必须记录,考虑用finally,如果日志业务如果只加@Transactional的话,会和具体的业务逻辑纳入到统一事务中,必须用REQUIRES_NEW,使得执行时会新开一个自己的事务。

@Service

public class LogServiceImpl implements LogService {    

        @Autowired    

        private LogDao logDao;    

        @Transactional(propagation = Propagation.REQUIRES_NEW)   

        public void log(String out,String in,Double money ) {        

                logDao.log("转账操作由"+out+"到"+in+",金额:"+money);    

        }

}

public void transfer(String out,String in ,Double money) {    

        try{        

                accountDao.outMoney(out,money);        

                accountDao.inMoney(in,money);    

        }finally {        

                logService.log(out,in,money);    

        }

}

相关文章:

  • 用word制作网页教程/优化设计七年级上册数学答案
  • wordpress 商品列表/百度竞价品牌广告
  • 免费购物网站制作/sem是什么的英文缩写
  • 动态网站一定要会动态编程吗/友链之家
  • PHP网站开发实例教程电子书/查网站关键词工具
  • 网站设计与网页制作岗位招聘信息/社交网络推广方法有哪些
  • Unity 过场工具(Cutscene)设计(二)
  • 蓝桥杯STM32G431RBT6学习——按键
  • 【C语言课程设计】通讯录(1.0版本)
  • Waf功能、分类与绕过
  • SpringBoot快速上手
  • K8s 如何通过 ConfigMap 来配置 Redis ?
  • 记录每日LeetCode 112.路径总和 Java实现
  • 洛谷 225153 数字组合
  • MySQL中给字符串字段加索引
  • 【redis6】第十章(事务和锁机制)
  • 4.Python基础之函数
  • PicGo+Gitee+Typora实现markdown图床