事務傳播行為----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.單個事務方法執行
從日志中可以看出,Spring 預設的事務傳播行為為PROPAGATION_REQUIRED,事務隔離級别為ISOLATION_DEFAULT,這個辨別對應到Mysql資料庫的事務隔離級别為Repeatable read(可重複讀取)。
sql執行情況:建立事務》擷取JDBC連接配接》執行sql》送出事務》釋放JDBC連接配接》将連接配接傳回連接配接池
2.業務層兩個事務方法間的互相調用,事務傳播行為為PROPAGATION_REQUIRED
delete和update使用了同一個事務,PROPAGATION_REQUIRED:表示該方法必須在事務中執行,若目前存在事務,則在該事務中執行,若沒有事務,則開啟一個新事務。
3.一個類中,方法A沒有事務,方法B有事務,A調用B,外部調用A,B的事務不會生效的
delete的事務沒有生效
原因:A調用B的時候,使用的是目前執行個體對象調用的,基于AOP的事務需要通過代理對象調用,事務才能生效
解決辦法:在類裡注入本身自己的bean,通過這個bean調用delete,事務就可以生效。
執行日志如下:
執行delete的時候開啟了一個新事務,事務生效。
[email protected]作用在私有private方法上不生效,項目啟動的時候,會周遊所有加了@Transactional注解的方法,若方法為私有的,則傳回Null,注解不生效