spring中的声明式事务控制

spring编程式事务:
1.创建TransactionTemplate模板

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 事务模板-->
    <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager"/>
    </bean>

然后在service层

@Autowired
private TransactionTemplate tstl;

//编程式事务
    @Override
    public void transfer(String sourceName, String targetName, Float money) {
    //这里使用的式lambda表达式,接口是TransactionCallBack
        tstl.execute((transactionStatus) -> {
            try {
                //根据名称查询转出用户
                AccountInfo p = accountDao.findByName(sourceName);
                //根据名称查询转入账户
                AccountInfo ppp = accountDao.findByName(targetName);
                //减钱
                p.setMoney(p.getMoney() - money);
                //收款方加钱
                ppp.setMoney(ppp.getMoney() + money);
                accountDao.updateAccount(p);
                int i = 10 / 0;
                accountDao.updateAccount(ppp);
            } catch (Exception e) {
                e.printStackTrace();
                transactionStatus.setRollbackOnly();
            }
            return null;
        });
    }

1.spring中基于xml的声明式事务配置步骤(声明式事务)

 1.配置事务管理器
 <!-- 1.配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
 2.2、配置事务的通知
            此时我们需要导入事务的约束 tx名称空间和约束,同时也需要aop的
            使用tx:advice标签配置事务通知
                属性:
                    id:给事务通知起一个唯一标识
                    transaction-manager:给事务通知提供一个事务管理器引用
  <!-- 3.配置事务的通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!-- 5.配置事务的属性
                isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。
                propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。
                read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。
                timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。
                rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。
                no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。
        -->
        <tx:attributes>
        	<!-- 作用所有-->
            <tx:method name="*" propagation="REQUIRED" read-only="false"/>
            <!-- 作用与查询方法上,方法需遵循find开头-->
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
        </tx:attributes>
    </tx:advice>

3.配置AOP中的通用切入点表达式

 <!-- 4.配置aop-->
    <aop:config>
        <!-- 4.配置切入点表达式-->
        <aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl.*.*(..))"></aop:pointcut>
        <!--建立切入点表达式和事务通知的对应关系 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
    </aop:config>

spring中基于注解的声明式事务控制

 <!-- spring中基于注解 的声明式事务控制配置步骤
        1、配置事务管理器
        2、开启spring对注解事务的支持
        3、在需要事务支持的地方使用@Transactional注解


     -->
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>


<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    <!-- 开启spring对注解事务的支持-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

使用Transactional注解
作用于类或方法上
例如:

//只读型事务的配置
@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
//读写型事务配置
@Transactional(propagation=Propagation.RQUIRED,readonly=false)

spring全注解开发:
1.主配置文件

@Configuration
@ComponentScan(basePackages = "com.itheima")
@PropertySource("jdbc.properties")
@Import({JdbcConfig.class,TransactionManagerConfig.class})
@EnableTransactionManagement
public class SpringConfiguration {

}

2.加载jdbc配置

public class JdbcConfig {
    @Value("${jdbc.driverClass}")
    private String driverClass;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    /**
     * 创建jdbcTemplate
     * @param ds
     * @return
     */
    @Bean(name = "jdbcTemplate")
    public JdbcTemplate createJdbcTemplate(DataSource ds) {
        return new JdbcTemplate(ds);
    }

    /**
     * 创建数据源并交给spring管理
     * @return
     */
    @Bean(name ="dataSource")
    public DataSource createDateSource() {
        DriverManagerDataSource ds = new DriverManagerDataSource(url,username,password);
        return ds;
    }
}

3.创建事务管理器

public class TransactionManagerConfig {
    /**
     * 创建事务管理器
     * @param dataSource
     * @return
     */
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值