天天看點

事務傳播行為----PROPAGATION_REQUIRED

事務傳播行為----PROPAGATION_REQUIRED

SpringBoot整合Mybatis,Sql語句的執行情況沒有打日志,是以增加了如下配置:

logback-spring.xml

<!--myibatis log configure-->
    <logger name="com.apache.ibatis" level="DEBUG"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
           

application.yml

mybatis:
  type-aliases-package: com.liu.entity
logging:
  config: classpath:logback-spring.xml
           

(Spring Boot預設使用的是logback日志架構)由于日志級别設定成了debug,内容釋放詳細,就順便研究了下spirng的事務。

1.單個事務方法執行

事務傳播行為----PROPAGATION_REQUIRED

從日志中可以看出,Spring 預設的事務傳播行為為PROPAGATION_REQUIRED,事務隔離級别為ISOLATION_DEFAULT,這個辨別對應到Mysql資料庫的事務隔離級别為Repeatable read(可重複讀取)。

sql執行情況:建立事務》擷取JDBC連接配接》執行sql》送出事務》釋放JDBC連接配接》将連接配接傳回連接配接池

2.業務層兩個事務方法間的互相調用,事務傳播行為為PROPAGATION_REQUIRED

事務傳播行為----PROPAGATION_REQUIRED

delete和update使用了同一個事務,PROPAGATION_REQUIRED:表示該方法必須在事務中執行,若目前存在事務,則在該事務中執行,若沒有事務,則開啟一個新事務。

3.一個類中,方法A沒有事務,方法B有事務,A調用B,外部調用A,B的事務不會生效的

事務傳播行為----PROPAGATION_REQUIRED

delete的事務沒有生效

原因:A調用B的時候,使用的是目前執行個體對象調用的,基于AOP的事務需要通過代理對象調用,事務才能生效

解決辦法:在類裡注入本身自己的bean,通過這個bean調用delete,事務就可以生效。

執行日志如下:

事務傳播行為----PROPAGATION_REQUIRED

執行delete的時候開啟了一個新事務,事務生效。

[email protected]作用在私有private方法上不生效,項目啟動的時候,會周遊所有加了@Transactional注解的方法,若方法為私有的,則傳回Null,注解不生效

事務傳播行為----PROPAGATION_REQUIRED

繼續閱讀