Spring事务相关

@Transactional:

    •可设置的属性:

                •value|transactionManager:指定事务管理器。

                •propagation:指定该事物的传播属性,默认值是Propagation.REQUIRED。

                •isolation:指定事务隔离级别,默认值是Isolation.DEFAULT。

                •timeout:该事务的超时时间,默认值为-1,代表使用依赖的事务系统的默认超时时间。

                •readOnly:默认值为false,为true表示该事务只读。

                •rollbackFor|rollbackForClassName:指定0个或多个Throwable的子类,遇到这些异常必须回滚。默认是RuntimeException和Error及其子类。

                •noRollbackFor|noRollbackForClassName:指定0个或多个Throwable的子类,遇到这些异常不会滚。


传播属性介绍:

            •REQUIRES_NEW:创建一个新事务,如果之前有事务,挂起。

            •REQUIRED :之前有,就是用之前的;之前没有,创建新的。

            •SUPPORTS :支持在事务中运行。没有事务也无所谓。

            •NOT_SUPPORTED :不支持在事务中运行,如果之前有,挂起。

            •MANDATORY :必须在事务中运行,如果之前没有,抛异常。

            •NEVER :不能再事务中运行,如果之前有,抛异常。

            •NESTED :内嵌事务,如果之前没有事务,和REQUIRED 一样。内嵌事务和外部事务一起提交和回滚,内嵌事务也可以单独回滚。


示例总结:

        1. 默认情况下,只有RuntimeException和Error才会回滚。

        2. 同时指定rollbackFor和noRollbackFor时,从抛出类的继承关系和指定的rollbackFor和noRollbackFor做比较,从下往上,距离抛出类最近的获胜。如果没有找到,使用默认规则。

        3. 只读

            3.1 针对下面这种情况,如果在没有事务的方法调用这个方法时,会抛错:java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed


Spring事务相关_第1张图片

            3.2 如果是下面这种情况,又不会抛错


Spring事务相关_第2张图片

            3.3 而对于这种新创建一个事务指定了readOnly的,同样会抛错。


Spring事务相关_第3张图片

        4. 内嵌事务(Propagation.NESTED):内嵌事务和外部事务一起提交和回滚,内嵌事务也可以自己回滚。

内嵌自己回滚的示例:


Spring事务相关_第4张图片

        5. rollbackOnly:

            下面的示例是一个required的方法调用了另外一个required的方法,被调用的方法在执行DB操作之后,抛了异常。这种情况,第一个方法的操作也会被回滚。

异常:org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only


Spring事务相关_第5张图片

你可能感兴趣的:(Spring事务相关)