309 元,小米中樞閘道器今日開啟眾籌:全新本地中樞架構,可連線百款裝置
阿新 • • 發佈:2022-03-23
8、宣告式事務
8.1、事務ACID原則
-
原子性(atomicity)
- :事務中包括的操作要麼都做,要麼都不做
-
一致性 (consistency)
- :針對一個事務操作前與操作後的狀態一致
-
隔離性(isolation)
- :一個事務的執行不能被其他事務干擾
- 造成的問題:
- 髒讀:指一個事務讀取了另外一個事務未提交的資料
- 不可重複讀:在一個事務內讀取表中的某一行資料,多次讀取結果不同(資料內容不一致)
- 幻讀:是指在一個事務內讀取到了別的事務插入的資料,導致前後讀取到的資料不一致
-
永續性 (durability)
- :指一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的,不可逆的
- 如果在操作之前(事務還沒有提交)伺服器宕機或者斷電,那麼重啟資料庫之後,資料狀態還是操作之前的,恢復到原狀
- 如果在操作後(事務已經提交)伺服器宕機或者斷電,那麼重啟資料庫之後,資料狀態應為操作之後的,持久化到資料庫
- :指一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的,不可逆的
8.2、spring中配置宣告式事務
-
配置宣告事務
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
-
結合AOP實現事務的織入
-
配置事務通知
<tx:advice id="transactionInterceptor" transaction-manager="transactionManager"> <tx:attributes> <!-- 需要開啟事務訂單方法 --> <!-- 傳播特性 propagation 預設是REQUIRED--> <!-- read-only="true"表只讀事務--> <tx:method name="queryAllUser" propagation="REQUIRED"/> <tx:method name="deleteUserById" propagation="REQUIRED"/> <tx:method name="addUser" propagation="REQUIRED"/> <tx:method name="*"/> </tx:attributes> </tx:advice>
-
propagation
傳播行為(PROPAGATION) 描述 PROPAGATION_REQUIRED 如果當前沒有事務,就新建一個事務,如果已存在一個事務中,加入到這個事務中,這是最常見的選擇。 PROPAGATION_SUPPORTS 支援當前事務,如果沒有當前事務,就以非事務方法執行 PROPAGATION_MANDATORY 使用當前事務,如果沒有當前事務,就丟擲異常 PROPAGATION_REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起 PROPAGATION_NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起 PROPAGATION_NEVER 以非事務方式執行操作,如果當前事務存在則丟擲異常 PROPAGATION_NESTED 如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED 類似的操作 原文連結:https://blog.csdn.net/zhangsweet1991/article/details/83897211
-
-
事務的切入 ,我用的這個版本spring開啟事務的時候需要把proxy-target-class="true"開啟cglib的方式
<!-- - 事務的切入--> <aop:config proxy-target-class="true"> <aop:pointcut id="txPointcut" expression="execution(* com.mhy.mapper.*.*(..))"/> <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="txPointcut"/> </aop:config>