基于spring实现事务

想象一个银行转钱的场景,如果当转账的时候操作失误,然后钱扣了,但接收人的账号却没有钱到账,这多亏呀,所以这里就需要用到事务,事务的原子性就是事务内一个操作失败了就回滚到原来的状态,从而解决了这尴尬的局面。下面就用spring来实现上面的场景。
老套路,先创建一个接口:

package exchange;

public interface account {
    void addMoney(Integer id,Double money);
    void mulMoney(Integer id,Double money);
}

随后实现这些方法

package exchange;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class exchangeMethod extends JdbcDaoSupport implements account {

    @Override
    public void addMoney(Integer id, Double money) {
        super.getJdbcTemplate().update("update t_user set money = money + ? where id = ?",money,id);
    }

    @Override
    public void mulMoney(Integer id, Double money) {
        super.getJdbcTemplate().update("update t_user set money = money - ? where id = ?",money,id);
    }
}

然后创建一个实现转钱功能的方法

package exchange;

public class accountService {
    public void setEm(exchangeMethod em) {
        this.em = em;
    }

    private exchangeMethod em;
    public void exchangeMoney(Integer from,Integer to,Double money){
        em.mulMoney(from,money);
//        int i = 1/0;        特地弄成故障的代码
        em.addMoney(to,money);
    }
}```

再来把类都配置到spring容器中

<?xml version="1.0" encoding="UTF-8"?>







    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>                       <!--spring封装的事务核心管理器-->
    </bean>

    <bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
            <property name="transactionManager" ref="transactionManager"></property>       <!--spring封装的事务模板-->
    </bean>

    <tx:advice transaction-manager="transactionManager" id="txAdvice">                      <!--把事务变成通知-->
            <tx:attributes>
                    <tx:method name="exchangeMoney" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>   <!--业务方法配置-->
            </tx:attributes>
    </tx:advice>
    
    <aop:config>
            <aop:pointcut id="accS" expression="execution(* exchange.accountService.exchangeMoney(..))"></aop:pointcut>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="accS"></aop:advisor>

    </aop:config>

    <bean name="em" class="exchange.exchangeMethod">
            <property name="dataSource" ref="dataSource"></property>
    </bean>

    <bean name="as" class="exchange.accountService">
            <property name="em" ref="em"></property>
    </bean>
``` 最后写一个demo来实现这个功能
package exchange;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class demo1 {
    public static void main(String args[]) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("exchange/applicationContext.xml");
        accountService acc = (accountService) ac.getBean("as");
        acc.exchangeMoney(2,3,100d);//d是把100转换为Double类型
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值