基于AOP的声明式事务控制

mapper

@Repository
public interface AccountMapper {

    //+钱
    @Update("update account set money=money+#{money} where name=#{name}")
    // 参数中需要指定映射
    public void addMoney(@Param("name") String name, @Param("money") Integer money);
    // -钱
    @Update("update account set money=money-#{money} where name=#{name}")
    public void subMoney(@Param("name") String name, @Param("money") Integer money);
}



 

applicationContext

<!--组件扫描-->
    <context:component-scan base-package="com.edu"/>
<!--    加载properties文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
<!--    配置数据源-->
    <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>
<!--    配置SqlSessionFactoryBean,将SqlSessionFactory注入到spring容器-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!--    MapperScannerConfigurer 扫描指定的包 产生Mapper对象到容器-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.edu.mapper"/>
    </bean>

service

@Service("accountService")
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountMapper accountMapper;
    @Override
    public void transferMoney(String outAccount, String inAccount, Integer money) {
        accountMapper.addMoney(outAccount,money);
        int i = 1/0; // 这里如果发生异常,out会加钱,in不会减钱,钱去哪里了
        accountMapper.subMoney(inAccount,money);
    }
}

默认 addmoney submoney 是两个事务,我们需要使他们同时成功或同时失败

accountMapper.addMoney(outAccount,money); int i = 1/0; // 这里如果发生异常,out会加钱,in不会减钱,钱去哪里了 accountMapper.subMoney(inAccount,money);

这里如何解决

可以使用AOP对Service的方法进行事务的增强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值