事务是逻辑处理原性的保证段,通过使事务控制,可以极地避免出现逻辑处理失败导致的脏数据等问题。Transactional Transactional是声明式事务的注解,可以被标记在类上、接口、方法上。publicinterfaceTransactional{AliasFor(transactionManager)Stringvalue()事务管理器,值为bean的名称,这个主要用于多事务管理器情况下指定。比如多数据源配置的情况下。AliasFor(value)StringtransactionManager()事务的传播行为,默认值为Propagation。REQUIRED。Propagationpropagation()defaultPropagation。REQUIRED;事务的隔离级别,默认是Isolation。DEFAULT。Isolationisolation()defaultIsolation。DEFAULT;事务的超时时间,单位为秒inttimeout()default1;用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。如果一个事务只涉及到只读,可以设置为true。booleanreadOnly()用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。默认是在RuntimeException和Error上回滚。C?extendsThrowable〔〕rollbackFor()default{};String〔〕rollbackForClassName()default{};和rollbackFor互补,抛出指定的异常类型时不回滚事务,也可以指定多个异常类型。C?extendsThrowable〔〕noRollbackFor()default{};String〔〕noRollbackForClassName()default{};}传播级别和使用场景 事务传播级别定义了事务的控制范围publicenumPropagation{REQUIRED(0),SUPPORTS(1),MANDATORY(2),REQUIRESNEW(3),NOTSUPPORTED(4),NEVER(5),NESTED(6);privatePropagation(intvalue){this。}publicintvalue(){returnthis。}}PROPAGATIONREQUIRED(默认) 如果上下中已经存在事务,那么就加到事务中执,如果当前上下中不存在事务,则新建事务执。classC1(){Transactional(propagationPropagation。REQUIRED)functionA(){C2。B();}}classC2(){Transactional(propagationPropagation。REQUIRED)functionB(){}} 若B方法抛出异常,A方法进行捕获,A会抛出异常,因为C2标志回滚,C1标志提交,产生冲突。 若B方法抛出异常,B方法内部捕获,A、B都不会回滚。 若A或B抛出异常,但没有捕获,则A、B都回滚。 A、B可操作同一行记录,因为处在同一事务中。PROPAGATIONMANDATORY 该级别的事务要求上下中必须要存在事务,否则就会抛出异常! 能有效地控制上下调代码遗漏添加事务控制。 如段代码不能单独被调执,但是旦被调,就必须有事务包含的情况,就可以使这个传播级别。PROPAGATIONREQUIRESNEW 每次都会新建个事务,并且同时将上下中的事务挂起,执当前新建事务完成以后,上下事务恢复再执。classC1(){Transactional(propagationPropagation。REQUIRED)functionA(){C2。B();}}classC2(){Transactional(propagationPropagation。REQUIRENEW)functionB(){}} 若B方法抛出异常,A方法进行捕获,B方法回滚,A方法不受B异常影响。 若B方法抛出异常,B方法进行捕获,A、B都不会回滚。 若A方法抛出异常,不会影响B正常执行。 若B方法抛出异常,A、B方法都没有处理,则A、B都会回滚。 A、B不可操作同一条记录,因为处于不同事务中,会产生死锁。PROPAGATIONSUPPORTS 如果上下存在事务,则持事务加事务,如果没有事务,则使事务的式执。 通常是来处理那些并原性的核业务逻辑操作。应场景较少。PROPAGATIONNOTSUPPORTED 若当前上下中存在事务,则挂起事务,执当前逻辑,结束后恢复上下的事务。 可以将事务范围尽可能地缩,建议优先使用代码隔离的方式进行 个事务越,它存在的险也就越多PROPAGATIONNEVER 要求上下中不能存在事务,旦有事务,就抛出runtime异PROPAGATIONNESTED 如果当前存在事务,则嵌套(savepoint)在当前事务中执行。如果当前没有事务,则新建一个事务,类似REQUIRENEW。