java 中的事物怎么配置_【Java】SpringBoot如何在Controller方法中配置事务?

通过以下方法配置的注解事务可以在Service类使用,但无法在SpringMVC的Controller类中使用。

上网查过很多资料,也翻阅过官方文档,官网是说Servlet中的WebApplicationContext与ContextLoaderListener加载的WebApplicationContext有所不同,如下图:

bc0b3bb3057ed243a72133078b5e124e.png

查阅资料后得知,传统标签或Java注解配置方式的 @EnableTransactionManager是通过SpringAOP的环绕切片实现,只能作用在与环绕切片在同一上下文中的Bean的方法上。

例如:在Root WebApplicationContext中声明,就只能作用在这个Context的services和repositories中,但没法作用在Controllers中,所以Controller中的@Transational注解会无效。

关于不使用SpringBoot时的解决方案是在web.xml配置中使用为DispatcherServlet初始化时传入带有标签的上下文。

现在我想问如何以Java代码配置方式+SpringBoot实现在Controllers中使用@Transactional注解?

以下是我的尝试,先给出Controller部分代码:

71c58b0c7367eb1272e233cfd2663d4d.png

第一种SpringBoot配置方式:

0e5b6de5752d95a2ae74705547213345.png

这种方式实践结果是失败的,程序抛出 javax.persistence.TransactionRequiredException: Executing an update/delete query 异常。

回答

我是这么用的:

@Configuration

@ConfigurationProperties(locations = "classpath:server.yml",prefix = "mybatis")

public class DataSourceConf {

private String url;

private String username;

private String password;

@Bean

public DataSource dataSource(){

DruidDataSource dataSource = new DruidDataSource();

dataSource.setDriverClassName("com.mysql.jdbc.Driver");

dataSource.setUrl(url);

dataSource.setUsername(username);

dataSource.setPassword(password);

dataSource.setTestWhileIdle(true);

dataSource.setValidationQuery("select 1");

// dataSource.setDefaultAutoCommit(false); // 默认事务管理器提交的,没用

return dataSource;

}

/**

* spring transaction manager

*/

@Bean

public DataSourceTransactionManager transactionManager(DataSource rdsDataSource) {

return new DataSourceTransactionManager(rdsDataSource);

}

/**

* mybatis session factory 。。。

*/

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值