Spring超詳細講解事務
什么是事務
一個數(shù)據(jù)庫事務是一個被視為一個工作單元的邏輯上的一組操作,這些操作要么全部執(zhí)行,要么全部不執(zhí)行。
需要注意的是,并不是所有的數(shù)據(jù)庫(引擎)都支持事務,比如說MySQL的MyISAM存儲引擎
事務的四個特性(ACID)
原子性:事務是一個原子性操作,一個事務由一系列操作組成,這一系列操作要么全部執(zhí)行完成,要么全部不執(zhí)行
一致性:一個事務執(zhí)行完成(不管成功還是失?。?,數(shù)據(jù)庫的完整性不能被破壞(唯一約束,外鍵約束等)
隔離性:數(shù)據(jù)庫允許多個并發(fā)事務同時對數(shù)據(jù)進行讀寫操作,隔離性可以防止這些操作同時執(zhí)行時導致的數(shù)據(jù)不一致的問題。事務分為不同的隔離級別:讀未提交(read uncommitted)、讀已提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)
持久性:持久性意味著事務完成之后,該事物對數(shù)據(jù)的更改會永久的保存在數(shù)據(jù)庫中。
Spring對事務的支持
Spring支持編程式事務管理和聲明式事務管理兩種類型的事務管理。
編程式事務管理比較靈活,但是很難維護,平時用的很少。
聲明式事務管理易用性更高,侵入性、耦合度低,更推薦使用。
編程式事務管理
使用TransactionTemplate進行編程式事務管理
@Autowired
TransactionTemplate transactionTemplate;
public void doTest() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
try {
// 業(yè)務代碼
userMapper.deleteById(200106);
int i = 10/0;
} catch (Exception e) {
transactionStatus.setRollbackOnly();
}
}
});
}
使用PlatformTransactionManager進行編程式事務管理
@Autowired
PlatformTransactionManager platformTransactionManager;
public void doTest() {
TransactionStatus transaction = platformTransactionManager.getTransaction(new DefaultTransactionDefinition());
try{
// 業(yè)務代碼
userMapper.deleteById(200106);
int i = 10/0;
platformTransactionManager.commit(transaction);
}catch (Exception e){
platformTransactionManager.rollback(transaction);
}
}
聲明式事務管理
Spring主要通過兩種方式實現(xiàn)聲明式事務管理:
基于注解的聲明式事務管理
基于XML的聲明式事務管理
基于注解的聲明式事務管理
注解的事務管理主要靠@Transactional注解來實現(xiàn)的。
@Transactional注解可以作用于類或方法上,作用于類上時,該類的所有public方法都具有該事物屬性
@Transactional注解只應該被應用到public修飾的方法上,這是有Spring AOP的本質(zhì)決定的
@Transactional
public void doTest() {
userMapper.deleteById(200106);
int i = 10/0;
}@Transactional注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
// 指定事務管理器
@AliasFor("transactionManager")
String value() default "";
@AliasFor("value")
String transactionManager() default "";
// 事務的傳播行為(enum)
Propagation propagation() default Propagation.REQUIRED;
// 事務的隔離級別(enum)
Isolation isolation() default Isolation.DEFAULT;
// 事務超時時間
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
// 讀寫或只讀事務,默認讀寫事務
boolean readOnly() default false;
// 導致事務回滾的異常類
Class<? extends Throwable>[] rollbackFor() default {};
// 導致事務回滾的異常類名
// noRollbackForClassName = {"ArithmeticException"}
String[] rollbackForClassName() default {};
// 不會導致事務回滾的異常類
Class<? extends Throwable>[] noRollbackFor() default {};
// 不會導致事務回滾的異常類名
String[] noRollbackForClassName() default {};
}
Spring事務管理的三個接口
Spring對事務的操作主要通過PlatformTransactionManager接口,通過這個接口,Spring為各大平臺提供了對應的事務管理器,如 JDBC(org.springframework.jdbc.datasource.DataSourceTransactionManager )等。
在Spring框架中,事務管理相關的最重要的三個接口如下:
PlatformTransactionManager
public interface PlatformTransactionManager extends TransactionManager {
// 根據(jù)指定的傳播行為,該方法返回當前活動事務或創(chuàng)建一個新的事務
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
// 提交指定的事務和關于它的狀態(tài)
void commit(TransactionStatus status) throws TransactionException;
// 回滾事務
void rollback(TransactionStatus status) throws TransactionException;
}TransactionDefinition
public interface TransactionDefinition {
// …………
// 返回傳播行為
default int getPropagationBehavior() {
return PROPAGATION_REQUIRED;
}
// 返回該事務隔離級別
default int getIsolationLevel() {
return ISOLATION_DEFAULT;
}
// 返回超時時間
default int getTimeout() {
return TIMEOUT_DEFAULT;
}
// 返回是否只讀
default boolean isReadOnly() {
return false;
}
// 返回事務名稱
@Nullable
default String getName() {
return null;
}
static TransactionDefinition withDefaults() {
return StaticTransactionDefinition.INSTANCE;
}
}
TransactionStatus
public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable {
boolean hasSavepoint();
@Override
void flush();
}
Spring事務屬性
Spring事務管理的五大屬性:隔離級別、傳播行為、超時時間、是否只讀、回滾規(guī)則
在TransactionDefinition接口中定義了事務的隔離級別、傳播行為、超時時間的常量
public interface TransactionDefinition {
// 當前存在事務,則加入該事務;如果當前沒有事務,則創(chuàng)建一個新的事務
int PROPAGATION_REQUIRED = 0;
// ~,~,~,則繼續(xù)以非事務的方式運行
int PROPAGATION_SUPPORTS = 1;
// ~,~,~,則拋出異常
int PROPAGATION_MANDATORY = 2;
// 創(chuàng)建一個新事務,如果當前存在事務,則把當前事務掛起
int PROPAGATION_REQUIRES_NEW = 3;
// 以非事務的方式運行,如果當前存在事務,則把當前事務掛起
int PROPAGATION_NOT_SUPPORTED = 4;
// 以非事務的方式運行,如果當前存在事務,則拋出異常
int PROPAGATION_NEVER = 5;
// ~,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行,~,則等價于PROPAGATION_REQUIRED
int PROPAGATION_NESTED = 6;
// 默認的隔離級別
int ISOLATION_DEFAULT = -1;
// 讀未提交
int ISOLATION_READ_UNCOMMITTED = 1;
// 讀已提交
int ISOLATION_READ_COMMITTED = 2;
// 可重復讀
int ISOLATION_REPEATABLE_READ = 4;
// 序列化讀
int ISOLATION_SERIALIZABLE = 8;
// 默認的超時時間,單位:秒
// 所謂事務超時,就是規(guī)定一個事務允許執(zhí)行的最長時間,如果超過了該時間事務還沒有執(zhí)行完成,則回滾事務。
int TIMEOUT_DEFAULT = -1;
default int getPropagationBehavior() {
return PROPAGATION_REQUIRED;
}
default int getIsolationLevel() {
return ISOLATION_DEFAULT;
}
default int getTimeout() {
return TIMEOUT_DEFAULT;
}
default boolean isReadOnly() {
return false;
}
@Nullable
default String getName() {
return null;
}
static TransactionDefinition withDefaults() {
return StaticTransactionDefinition.INSTANCE;
}
}是否只讀:指該事物是只讀操作還是讀寫操作,boolean類型
回滾規(guī)則:我們可以人為的控制事務在執(zhí)行過程中拋出某些異常時仍然提交事務,或者拋出某些異常時回滾事務
到此這篇關于Spring超詳細講解事務的文章就介紹到這了,更多相關Spring事務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決MultipartFile.transferTo(dest) 報FileNotFoundExcep的問題
這篇文章主要介紹了解決MultipartFile.transferTo(dest) 報FileNotFoundExcep的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Spring?Data?JPA系列JpaSpecificationExecutor用法詳解
這篇文章主要為大家介紹了Spring?Data?JPA系列JpaSpecificationExecutor用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
MyBatis-Plus實現(xiàn)字段自動填充功能的示例
本文主要介紹了MyBatis-Plus實現(xiàn)字段自動填充功能的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
IDEA創(chuàng)建springboot依賴下載很慢的解決方法
maven會使用遠程倉庫來加載依賴,是一個國外的網(wǎng)站,所以會很慢,本文主要介紹了IDEA創(chuàng)建springboot依賴下載很慢的解決方法,具有一定的參考價值,感興趣的可以了解一下2023-12-12
Java中保證多線程間的數(shù)據(jù)共享的方法詳解
這篇文章詳解的發(fā)給大家介紹了Java中是如何保證多線程間的數(shù)據(jù)共享的,文中通過圖文介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2023-11-11
Java輸入三個整數(shù)并把他們由小到大輸出(x,y,z)
這篇文章主要介紹了輸入三個整數(shù)x,y,z,請把這三個數(shù)由小到大輸出,需要的朋友可以參考下2017-02-02
SpringBoot之HttpWebServiceMessageSenderBuilder用法詳解
這篇文章主要介紹了SpringBoot之HttpWebServiceMessageSenderBuilder用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04

