对于在@transactional注解起作用的前提下判断事务是否成功的解决方式

1、首先数据库有差异。Mysql一般情况下(myisam引擎)不支持事务,只有innodb引擎支持事务,而且事务是自动提交的。Oracle支持事务的手动提交。Sqlserver(自动提交)

2、Ssm采用注解方式管理事务,采用的是spring提供的DataSourceTransactionManager类来进行管理事务。

当请求到来,spring该类首先判断是否有该注解,如果有则表示支持事务,于是spring就看当前上下文是否存在事务,如果没有,就new Transaction,看该事务是否有connection链接与之绑定,没有就会从连接池拿一个con给当前事务。而jdbc的con默认是自动提交事务的,所以spring就会将自动改为手动,setAutoCommit(false)。在执行完之后又会设置为自动提交。这样就达到了事务控制业务的目的。

当然如果不打这个Transactional注解,spring就不会创建事务,但是这不代表就没有事务,只是不用transaction来控制而已。底层还是jdbc的Connection自带事务提交策略,那就是自动提交。

关于@transactional注解

如果没有异常,事务提交;如果有异常事务回滚。但是这个过程是隐式的,我们感知不到。但是对于正式的业务,如果失败的话,我们应当给客户一个提示。如果用try catch将整个service方法的代码包裹,出现异常就返回false,这种会给客户提示,但是事务却提交了。(原因:@transactional对于service层是根据方法是否执行完毕界定事务成功还是失败的,也就是说如果用try catch将整个service方法的代码包裹,service方法执行结束,事务就会提交,@transactional注解没有起作用;如过中间出现异常并且没有try catch事务就不会提交)

对于在@transactional注解起作用的前提下判断事务是否成功的解决方式

统一异常处理方式,service层不做处理,配置一款自己的异常处理器,当service层报错,抛出异常到controller层,controller方法出错直接被异常处理器捕获,跳转到自己设置的jsp失败页面,或者往前台返回json消息

猜你喜欢

转载自blog.csdn.net/wufeiha/article/details/80961965