SpringMVC @Transactional的陷井大坑引发No Session found for current thread

Spring事务管理详解
本文详细介绍了Spring框架下两种主要的事务管理方式:基于XML的配置和基于注解的配置,并探讨了@Transactional注解的使用技巧及常见问题。

一、TransactionManager事务配置

(1)注解配置

配置spring的xml加@Transactional
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />  

(2)xml配置

<tx:advice id="txAdvice" transaction-manager="transactionManager">  
    <tx:attributes>  
        <tx:method name="*" read-only="true" />  
        <tx:method name="save*" propagation="REQUIRED" />  
        <tx:method name="update" propagation="REQUIRED" />  
        <tx:method name="delete" propagation="REQUIRED" />  
    </tx:attributes>  
</tx:advice>  
<aop:config proxy-target-class="true">  
    <aop:pointcut expression="execution(public * com.mk.dao.impl.*.*(..))" id="servicePointcut" />  
    <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut" />  
</aop:config>  

二、@Transactional

(1)事务使用jdk接口动态代理

  暂无


(2)事务使用CGLIB类代理

需要设置spring的xml配置proxy-target-class="true"

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />  

1.大坑

@Transactional注解的类无法赋予继承的方法事务

如:

public abstract class Service<T extends Serializable,D extends Dao<T>> implements IService<T> {  
  
      
    protected D dao;  
  
    @Autowired  
    public void setDao(D dao) {  
    this.dao = dao;  
    }  
  
    //@Transactional  
    @Override  
    public T get(Integer id) {  
          
        if(Utils.isNull(id))  
            return null;  
          
        return dao.get(id);  
    }  
}  

@Transactional  
@org.springframework.stereotype.Service  
public class UserService extends Service<User, UserDao> {  
  
}  

即在调用UserService的get方法时会抛出No Session found for current thread异常


2.中坑

@Transactional注解在接口或接口的方法,事务失效,CGLIB无法从继承中获取Transactional注解


3.小坑

@Transactional注解在public方法才有效,其他protected等方法都不起事务作用


### `@Transactional` 注解的归属框架 `@Transactional` 是 Spring 框架提供的核心注解之一,用于声明事务边界管理[^1]。该注解并不属于 Spring MVC 框架,而是 Spring 的核心模块 Spring Transaction 提供的功能。Spring MVC 是 Spring 框架的一个子模块,主要用于构建基于 Web 的应用程序,处理 HTTP 请求和控制器逻辑。 尽管 `@Transactional` 可以在 Spring MVC 应用中使用,但其本质是与事务管理相关的通用机制,并不局限于 Web 层的组件,而通常被广泛应用于数据访问层(DAO)和业务逻辑层(Service)。通过将 `@Transactional` 添加到类或方法上,开发者可以轻松启用声明式事务管理,确保数据库操作具有 ACID 特性。 例如,在服务层的方法上使用该注解时,Spring 会自动为该方法开启事务,并在方法正常执行完成后提交事务;如果方法抛出异常,则会根据配置进行回滚操作: ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void createUsers(List<User> users) { for (User user : users) { userRepository.save(user); } } } ``` 为了使 `@Transactional` 生效,还需要在 Spring 配置中定义事务管理器,例如使用 `DataSourceTransactionManager` 来支持本地事务: ```xml <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> ``` 此,需要在配置文件中启用基于注解的事务管理支持,以便 Spring 能够识别并处理 `@Transactional` 注解[^2]。 综上所述,`@Transactional` 是 Spring 框架的核心特性之一,不属于 Spring MVC 子框架。它主要服务于事务控制,尤其适用于涉及数据库持久化操作的数据访问层和业务逻辑层。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值