上一篇文章我们遇到的问题是:

虽然余额不足报错了,但是库存已经-1了,出现了购买者没有成功购买,但是库存已经减少了的异常情况。

在上一篇文章的基础上,只需要三步,就能配置事务管理,非常神奇。

一、配置配置事务管理器

首先要让spring知道配置了一个事务管理器,因为事务管理器根本上是作用于数据源DataSource的,所以要让spring知道事务管理器作用于那个数据源。

如下配置:

二、启动事务注解

事务管理器配置好了,接下来要让spring知道启动了事务注解,才能进行事务管理。

首先是开启tx注解(就是事务管理注解)。然后需要用transaction-manager属性把刚才配置好的事务管理器id加进来。

如下配置:

完整配置:

三、对方法加上@Transactional注解

之后就可以启动测试类:

成功进行数据库操作。我们前边提到的问题已经解决了,在金额不足导致无法购买的情况下,书的储量不会减少。

如果有事务管理,方法中只要有一个环节出现故障,数据就会回滚,恢复到出错前的状态,这样就比较省心了。

不用过多判断错误手动去写回滚操作,只需要把正确的情况单独拿出来,然后剩下的条件就直接手动报错,反正只要一出错spring就会帮你回滚,杜绝错误情况,只需要关注正常操作就好了。

就像这样:

只要money > price,就是正常情况,正确提交之后spring就让操作通过。

若非如此,就是报错,抛出余额不足的错误,错误操作,spring就让整个方法回滚。

二、总结

google一下之后,感觉有个解释非常好:

spring只是控制数据库的事务提交和回滚,借助于java的反射机制,在事务控制的方法(通常是service层的方法)前后获取事务开启session,然后执行你的数据操作。

如果你的方法内有异常被抛出,spring会捕获异常并回滚你在这个方法内所有的数据操作,如果成功则提交所有的数据,最后spring会帮你关闭需要关闭的东西。

所以spring想要做的是,要程序员专注于写逻辑,不需要关注数据库何时开启和关闭连接。

1 对 “spring 事务管理(二)声明式事务”的想法;

评论被关闭。