3.Spring_申明式事务

本文详细介绍了Spring框架中声明式事务的配置方法,包括全XML配置、半XML半注解以及纯注解方式,帮助读者理解如何在不同场景下管理事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.声明式事务
申明式事务,底层采用的是AOP,动态代理技术支持事务。
AOP中,Spring唯一可以提供的动态代理技术支持,就是代码固定的事务管理,spring提供切面类。
被增强类为业务层代码,增删改必须实现事务支持。
2.基于全XML方式__spring配置文件
1.创建spring提供的切面类bean,DataSourceTransactionManager,交给IOC容器管理。
                            为事务管理器,配置一个连接池,比如druid。	
  创建自己写的类bean,被增强类。
  
2.事务配置到具体方法上,并配置事务的特性。	      	   
3.配置事务特性、配置AOP实现事务。

配置文件实现如下:
   //1.1 配置被增强类
   <bean id="AccountService" class="cn.itcast.service.impl.AccountServiceImpl">
   //1.2 配置增强类--切面类,spring提供
   <bean id="transactionManager"  class="...DataSourceTransactionManager">  
          <property name="dataSource" ref="dataSource" />  
   </bean>
   
   //2 配置事务通知的特性
   <tx:advice id="txAdvice" transaction-manager="transactionManager">
      	<tx:atributes>
			<tx:method name="add" isolation="" timeout="" read-only="" propagation=""/>
             // 使用*,为所有的查询方法配置事务。
             <tx:method name="find*" isolation="" timeout="" read-only="" propagation=""/>	
        </tx:atributes>
   <tx:advice/>
   //3 配置AOP实现增强
   <aop:config>
        <aop:pointcut id="pt" expresition="excution( * cn.itcast..save(..))"/> 
        <aop:advisor advisor-ref="logger" pointcut-ref="pt"></aop:advisor>
   </aop:config>
   
 1.补充
   接口类:PlatFormTransactionManager 
                     DataSourceTransactionManager:给JdbcTemplate和Mybatis使用
                     HibernateTransacntionManager:给Hibernate框架使用
                     JPATransacntionManager:针对所有ORM关系型数据库
 2.补充
 事务的特性:原子性、一致性、持久性、隔离性。
        隔离级别: 1.脏读:读未提交的数据。  企业开发必须解决。
                  2.解决脏读:读已提交数据。 oracle默认设置的隔离级别。
                  3.解决脏读、解决不可不重复读:能够重复读已提交数据。mysql默认设置的隔离级别。
                  4.解决所有问题:序列化。   但是开发中不用,效率最低。
      
      isolation: 一般设置为默认,DEFAULT。按照数据库的默认隔离界别。         
        timeout: 设置为-1。 开发中需要设置为永不超时。 
      read-only: 查询的方法,设置为true。因为不考虑增删改,操作数据库很快,
    propagation: 增删改设置为REQUIRED;查询设置为SUPPORT。
    
   事务的传播行为:当前方法如果是增删改,当前方法必须将事务传播给调用的方法中; 
                  当前方法如果是查询,当前方法支持将事务传播给调用的方法中;                            
3.半XML半注解方式_spring配置文件
 半XML:配置第三方框架的类bean,spring自己提供的类也是第三方的。 (spring的事务管理器)
       开启IOC容器扫描、开启事务注解(不需要开启AOP注解,事务包含)
半注解:配置自己写的类bean,以及配置spring的事务特性;(@Transactional1.开启IOC容器扫描、事务注解驱动,配置第三方类bean。										
2.在需要事务的类或者方法上使用@Transactional注解配置事务    
  
//1.步骤实现 
<context:component-scan base-package="cn.itcast"></context:component-scan >
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven> 
// <aop:aspectj-autoproxy></aop:aspectj-autoproxy>  //aop注解驱动,不需要在事务中开启的。
//第三方类bean
<bean id="transactionManager"  class="...DataSourceTransactionManager">  
    <property name="dataSource" ref="dataSource" />  
</bean>	 

//2.@Transactional的使用
 配置在类上:如果一个类,全部都是查询方法、或者一个类全部都是增删改。
 配置在方法上:我们一般都配置在方法上。
 增删改的事务配置:
 @Transactional(isolation=Isolation.DEFAULT,TIMEOUT=-1,readOnly=false,
                propagation=Propagation.REQUIRED)
 查询的事务配置:
 @Transactional(isolation=Isolation.DEFAULT,TIMEOUT=-1,readOnly=true,
                propagation=Propagation.SUPPORT)
4.纯注解方法_spring配置类
@Configuration  //配置类
@ComponentScan(basePackages = "cn.itcast")// <context:component-scan base-package="cn.itcast"></context:component-scan>
@EnableTransactionManagement//<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
@PropertySource(value = "classpath:jdbc.properties")//<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
public class SpringConfig {

    @Value(value = "${jdbc.driver}")
    private String driver;
    @Value(value = "${jdbc.url}")
    private String url;
    @Value(value = "${jdbc.username}")
    private String username;
    @Value(value = "${jdbc.password}")
    private String password;

    /*连接池*/
    @Bean(value = "driverManager")
    public DataSource createDataSource(){
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setDriverClassName(driver);
        driverManagerDataSource.setUrl(url);
        driverManagerDataSource.setUsername(username);
        driverManagerDataSource.setPassword(password);
        return driverManagerDataSource;
    }

    /*jdbcTemplate*/
    @Bean(value = "jdbcTemplate")
    public JdbcTemplate createJdbcTemplate(@Qualifier(value = "driverManager") DataSource ds){
        return new JdbcTemplate(ds);
    }

   /* DataSourceTransactionManager*/
   @Bean(value = "transactionManager")
   public DataSourceTransactionManager createDataSourceTransactionManager(@Qualifier(value = "driverManager") DataSource ds){
       DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
       dataSourceTransactionManager.setDataSource(ds);
       return dataSourceTransactionManager;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值