接着上文 java 代码样式为什么需要事务,讲述Spring5事务几种方式 认识API
下面 我们就来继续事务操作 我们重点使用声明式 本文叫大家用注解方式实现
首先 我们要在配置文件中 配置一个事务管理器
在bean.xnl最下面添加如下配置
<!-->配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref= "dataSource"></property>
</bean>
因为我们用的是Jdbc 就要用到对应的类 然后下面set需要注入一个数据源 这上面就是我们配置的一个数据源
第二部 在bean.xml中声明一个命名空间 叫 tx
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
最后 在bean.xml最下面方 添加代码如下
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
开启事务注解 这里 需要一个事务管理器 正好上面 我们刚声明了一个 用到了我们刚引入的tx命名空间
然后 我们将 senvice层下的transfAccoSenvice类加上注解
import org.springframework.transaction.annotation.Transactional;
@Transactional
类的顶上 加了一个 Transactional
这个注解代表的就是事务 可以加给类 也可以加给方法 加给类表示 整个类中所有的方法都会被添加事务
加给方法 那就是 这个方法会带有事务
非常的方便
我们打开数据库表 看一下两者的余额
然后 我们运行测试类代码 运行结果如下
还是 第一段sql执行成功了 然后 异常了 然后 我们会数据库去刷新一下表 再重新打开
可以看到 这次 李四并没有做冤大头 余额大家的都没有扣
说明我们的事务已经成功了
大家可能会想 是不是因为异常 所以都没变呢 但控制台明显看到 第一段减少的sql是执行完了的 而且控制台也输出了李四减完的余额11200.0
是因为 异常触发了事务回滚 数据都还原了
然后 我们将 senvice层下的transfAccoSenvice 中的 transferAccounts方法 修改如下
//转账方法
public void transferAccounts(int sponsorId, int recipientId, double money){
Boolean paym = pay(money,sponsorId);
if(paym){
income(money,recipientId);
System.out.println("交易完成");
}
}
我们去掉了会报异常的 int i = 10/0;
再次运行测试类
显然 我们这次的代码就完全运行成功了
到数据库刷新表 然后查看
可以看到 全部操作成功 事务也就提交啦