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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java線程監(jiān)聽,意外退出線程后自動重啟的實現(xiàn)方法
下面小編就為大家?guī)硪黄狫ava線程監(jiān)聽,意外退出線程后自動重啟的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03SpringBoot整合Spring Security構(gòu)建安全的Web應用
pring Security是一個強大的身份驗證和訪問控制框架,本文主要介紹了SpringBoot整合Spring Security構(gòu)建安全的Web應用,具有一定的參考價值,感興趣的可以了解一下2024-01-01elasticsearch節(jié)點的transport請求發(fā)送處理分析
這篇文章主要為大家介紹了elasticsearch節(jié)點的transport請求發(fā)送處理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04Java基礎之Comparable與Comparator概述
這篇文章主要介紹了Java基礎之Comparable與Comparator詳解,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04spring boot攔截器注入不了java bean的原因
這篇文章主要介紹了spring boot攔截器注入不了java bean的原因,幫助大家更好的理解和學習spring boot框架,感興趣的朋友可以了解下2020-11-11Java中List轉(zhuǎn)Map的幾種常見方式與對比
JavaList轉(zhuǎn)Map是一個非常常用的技術,對于Java開發(fā)人員來講,掌握該技術可以幫助我們更加高效地操作List集合中的對象,這篇文章主要給大家介紹了關于Java中List轉(zhuǎn)Map的幾種常見方式與對比的相關資料,需要的朋友可以參考下2024-02-02Springboot登錄驗證的統(tǒng)一攔截處理的實現(xiàn)
如果不進行統(tǒng)一的攔截處理,每次用戶請求你都要去進行用戶的信息驗證,所以本文主要介紹了Springboot登錄驗證的統(tǒng)一攔截處理的實現(xiàn),感興趣的可以了解一下,感興趣的可以了解一下2023-09-09