目錄
1.什么是事務?
2.事務的四大特性?
3.SpringBoot中怎樣開啟事務
? ?1.開啟事務支持?
? ? 2.在需要開啟事務的方法或類上使用@Transactional
? ? ??3.通過配置類來開啟全局事務
1.什么是事務?
事務是指在數據庫管理系統中執行的一系列操作的邏輯單元。事務可以由一個或多個數據庫操作(例如插入、更新、刪除等)組成,這些操作被視為一個不可分割的工作單元。在事務中,要么所有的操作都成功執行,要么所有的操作都不執行,不會出現部分操作成功而部分操作失敗的情況。
事務注解屬性:
-
傳播行為(Propagation):指定事務的傳播行為,即定義了事務方法調用之間的關系。常見的傳播行為包括:
- REQUIRED:如果當前存在事務,則加入該事務;如果不存在事務,則創建一個新事務。
- REQUIRES_NEW:無論當前是否存在事務,都創建一個新事務,并暫停當前事務(如果存在)。
- SUPPORTS:如果當前存在事務,則加入該事務;如果不存在事務,則以非事務方式執行。
- NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,則掛起該事務。
-
隔離級別(Isolation Level):指定事務的隔離級別,即定義了事務之間的可見性和并發控制的程度。常見的隔離級別包括:
- READ_UNCOMMITTED:允許讀取未提交的數據,可能導致臟讀、不可重復讀和幻讀問題。
- READ_COMMITTED:只能讀取已提交的數據,避免了臟讀問題,但可能導致不可重復讀和幻讀問題。
- REPEATABLE_READ:在同一個事務中多次讀取數據時,保證數據的一致性,避免了臟讀和不可重復讀問題,但可能導致幻讀問題。
- SERIALIZABLE:最高級別的隔離級別,完全隔離事務,避免了臟讀、不可重復讀和幻讀問題。
-
回滾規則(Rollback Rules):指定事務在遇到特定異常時是否回滾。可以定義多個回滾規則,每個規則可以配置一個或多個異常類型。如果事務拋出了與回滾規則匹配的異常,事務將回滾。
-
超時時間(Timeout):指定事務的最大執行時間。如果事務執行時間超過指定的超時時間,事務將被強制回滾。
2.事務的四大特性?
通常被稱為ACID特性
-
原子性(Atomicity):事務被視為一個不可分割的操作單元,要么全部執行成功,要么全部不執行。如果任何一部分操作失敗,整個事務將被回滾到最初狀態,所有的修改都會被撤銷。
-
一致性(Consistency):事務執行前后,數據庫的狀態必須保持一致。這意味著事務的操作必須滿足數據庫的約束和規則,以確保數據的完整性和有效性。
-
隔離性(Isolation):在并發環境下,多個事務可能同時執行。隔離性指的是每個事務的操作應該與其他事務相互隔離,使得每個事務都感覺不到其他事務的存在,避免了并發執行可能導致的數據不一致問題。
-
持久性(Durability):一旦事務提交成功,其所做的修改將永久保存在數據庫中,即使在系統發生故障或重啟之后也不會丟失。
事務的特點:?通過使用事務,可以保證數據庫的數據一致性和完整性,同時提供并發控制和故障恢復的機制,確保數據庫系統的可靠性和可用性。
3.SpringBoot中怎樣開啟事務
? ?1.開啟事務支持?
在啟動類中使用@EnableTransactionManagement開啟事務支持
package com.cssl;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;@SpringBootApplication
@EnableTransactionManagement//開啟事務支持
@MapperScan("com.cssl.mapper")
public class HospitalHouApplication {public static void main(String[] args) {SpringApplication.run (HospitalHouApplication.class, args);}}
? ? 2.在需要開啟事務的方法或類上使用@Transactional
? ? ? ? ? ? ? 事務中的注解屬性:
-
propagation
:指定事務的傳播行為。可以設置為?Propagation.REQUIRED
、Propagation.REQUIRES_NEW
、Propagation.SUPPORTS
、Propagation.NOT_SUPPORTED
?等。 -
isolation
:指定事務的隔離級別。可以設置為?Isolation.DEFAULT
、Isolation.READ_UNCOMMITTED
、Isolation.READ_COMMITTED
、Isolation.REPEATABLE_READ
、Isolation.SERIALIZABLE
?等。 -
readOnly
:指定事務是否為只讀事務。如果設置為?true
,則事務只能讀取數據,不能修改數據。這可以用于提高性能。 -
timeout
:指定事務的超時時間,單位為秒。如果事務執行時間超過指定的超時時間,事務將被回滾。 -
rollbackFor
?和?noRollbackFor
:指定事務回滾的異常類型。rollbackFor
?屬性用于指定需要回滾的異常類型,noRollbackFor
?屬性用于指定不需要回滾的異常類型。 -
rollbackForClassName
?和?noRollbackForClassName
:與上述屬性類似,但可以通過異常類名的字符串形式指定異常類型。
? ? ??3.通過配置類來開啟全局事務
? ? ? ? 優點:?
- 集中配置事務管理器
- 靈活的事務配置選項
- 多數據源支持
- 代碼整潔性和可維護性
- 與其他配置的集成
? ? ? ? 創建一個AopConfig的事務配置類
@Aspect
@Configuration
public class AopConfig {private final static int TX_METHOD_TIME_OUT = 10;private static final String POITCUT_EXPRESSION = "execution(* com.test.sketelon.service.*.*(..))";@Autowiredprivate PlatformTransactionManager platformTransactionManager;@Beanpublic TransactionInterceptor txadvice() {NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource ();Map<String, TransactionAttribute> nameMap = new HashMap<> (16);RuleBasedTransactionAttribute readOnlyRule = new RuleBasedTransactionAttribute ();readOnlyRule.setReadOnly (true);readOnlyRule.setPropagationBehavior (TransactionDefinition.PROPAGATION_REQUIRED);RuleBasedTransactionAttribute requireRule = new RuleBasedTransactionAttribute ();requireRule.setRollbackRules (Collections.singletonList (new RollbackRuleAttribute (Exception.class)));requireRule.setPropagationBehavior (TransactionDefinition.PROPAGATION_REQUIRED);requireRule.setTimeout (TX_METHOD_TIME_OUT);nameMap.put ("add*", requireRule);nameMap.put ("save*", requireRule);nameMap.put ("insert*", requireRule);nameMap.put ("update*", requireRule);nameMap.put ("delete*", requireRule);nameMap.put ("remove*", requireRule);nameMap.put ("batch*", requireRule);nameMap.put ("get*", readOnlyRule);nameMap.put ("query*", readOnlyRule);nameMap.put ("find*", readOnlyRule);nameMap.put ("select*", readOnlyRule);nameMap.put ("count*", readOnlyRule);source.setNameMap (nameMap);return new TransactionInterceptor (platformTransactionManager, source);}@Beanpublic Advisor txAdviceAdvisor() {AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut ();pointcut.setExpression (POITCUT_EXPRESSION);return new DefaultPointcutAdvisor (pointcut, txadvice ());}
}
到這就完成了!!!