Spring事务(二)

Spring事务的实现方式

1、编程式事务

通过代码的方式来实现:

先进行配置环境,再用代码实现

<!--开启注解(扫包)-->
<context:component-scan base-package="com.mgg.spring" />
<context:property-placeholder location="jdbc.properties" />

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

<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<!--配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private PlatformTransactionManager transactionManager;

@Override
public void transfer(String fromAccount, String toAccount, BigDecimal money) {
    DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
    TransactionStatus transaction = transactionManager.getTransaction(definition);

    String fromSql = "update account set balance = balance - ? where account_no = ?";
    String toSql = "update account set balance = balance + ? where account_no = ?";
    try {
        jdbcTemplate.update(fromSql, money, fromAccount);
        int a = 1/0;
        jdbcTemplate.update(toSql, money, toAccount);
    } catch (RuntimeException ex){
        ex.printStackTrace();
        //回滚事务
        transactionManager.rollback(transaction);
    }
    transactionManager.commit(transaction);
}

通过AOP方式实现:

使用方法拦截器,当方法执行有异常时回滚事务,否则提交事务

环境配置加入以下配置,再使用方法拦截器实现

<!--配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

<!--自定义事务通知-->
<bean id="txAdvice" class="com.mgg.spring.aop.TxAdvice">
    <property name="transactionManager" ref="txManager" />
</bean>
<aop:config>
    <aop:pointcut id="methodPoint" expression="execution(* com.mgg.spring.service..*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="methodPoint" />
</aop:config>
PlatformTransactionManager transactionManager;

public void setTransactionManager(PlatformTransactionManager transactionManager) {
    this.transactionManager = transactionManager;
}

@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
    System.out.println("拦截方法>>>>");
    DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
    TransactionStatus transaction = transactionManager.getTransaction(definition);
    Object returnObj = null;
    try {
        returnObj = invocation.getMethod().invoke(
                invocation.getThis(),
                invocation.getArguments()
        );
    } catch (RuntimeException ex){
        ex.printStackTrace();
        transactionManager.rollback(transaction);
    }
    transactionManager.commit(transaction);
    return returnObj;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值