关于@Transactional的使用

1.来源

@Transactional是spring-tx-5.2.12.RELEASE.jar下的一个注解,用户定义事务和处理事务

2. 事务

事务可以理解为一系列不可分割的操作。事务具有ACID的特性。

3.做什么

根据事务的特性,所以当我们需要整体化的处理某一些操作时,可以将这些操作封装到同一个事务中进行处理,保证数据的一致性。举个简单的例子:你去菜市场买苹果,对你来说,你需要做以下的操作:1.给老板钱 2.拿走苹果。 这两件事应该是要么同时发生,要么同时不发生的。出现你给老板钱了,没拿苹果或者是你没给钱,直接拿走了苹果,这些都是不合理的。所以为了保证这两件事的同步发生,在程序中可以放在同一个事务中进行处理。

4.定义事务

在sprintboot中,可以使用@Transactional注解来定义事务。@Transactional可以注解在service类上,也可以注解到各个方法上。一般推荐注解到方法。@Transactional放在service类上时,则service中的每个方法都会被定义成事务,按照事务的规则进行处理。@Transactional放在方法上,则只是注解的方法是事务方法。

4.1 常用属性

rollbackFor:指定事务执行过程中,发生了什么操作,会执行回滚。通常会指定一个异常类的class。

5.回滚处理

什么是回滚?回滚就是事务执行遇到异常时,会将数据库恢复到事务执行前的状态的过程。接着上面的例子:你买苹果,给了老板钱,然后拿着苹果准备回家了。老板接到钱一看,不行啊,你这是个假币啊。然后你就只能把苹果放回去,然后拿着你的假币回家了(老板不报警的话。。使用假币违法!)。这就是回滚。

5.1 回滚的定义

一般情况下,会使用rollbackFor来指定回滚的触发条件。比如,你设置@Transactional(rollbackFor = Exception.class),那么下面的方法执行过程中,如果抛出了Exception,则会进行回滚。如果你设置为@Transactional(rollbackFor = RunnableTimeException.class),则抛出RunnableTimeException时会进行回滚,抛出其他的异常则不会回滚。所以你可以使用rollbackFor来定义你事务回滚的触发条件。值得一提的是,@Transactional设置在service类上时,是可以不指定rollbackFor的,他默认的值是RunnableTimeException.class。
对了,有一种情况需要特殊注意下。你在Service种定义了A() B()两个方法,同时A没有启用Transactional,在B方法上启用了Transactional。同时A方法的执行过程中,调用了B方法。这种情况下,controller直接调用B方法的时候,发生异常是会执行回滚的,而如果是controller调用了A方法,此时B方法同样是抛出了异常,这种情况下,是不会发生回滚的。如果反过来,A启用了Transactional,B方法没有启用Transactional,则Controller调用A,A调用了B,B在执行过程种抛出了异常,这时候,事务会进行回滚。

6.其他

嗯 其他的还没想到。

你可能感兴趣的:(Springboot,数据库,java,开发语言)