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的方法进行事务的增强