<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
一個資料庫事務是一個被視為一個工作單元的邏輯上的一組操作,這些操作要麼全部執行,要麼全部不執行。
需要注意的是,並不是所有的資料庫(引擎)都支援事務,比如說MySQL的MyISAM儲存引擎
原子性:事務是一個原子性操作,一個事務由一系列操作組成,這一系列操作要麼全部執行完成,要麼全部不執行
一致性:一個事務執行完成(不管成功還是失敗),資料庫的完整性不能被破壞(唯一約束,外來鍵約束等)
隔離性:資料庫允許多個並行事務同時對資料進行讀寫操作,隔離性可以防止這些操作同時執行時導致的資料不一致的問題。事務分為不同的隔離級別:讀未提交(read uncommitted)、讀已提交(read committed)、可重複讀(repeatable read)和序列化(Serializable)
永續性:永續性意味著事務完成之後,該事物對資料的更改會永久的儲存在資料庫中。
Spring支援程式設計式事務管理和宣告式事務管理兩種型別的事務管理。
程式設計式事務管理比較靈活,但是很難維護,平時用的很少。
宣告式事務管理易用性更高,侵入性、耦合度低,更推薦使用。
使用TransactionTemplate進行程式設計式事務管理
@Autowired TransactionTemplate transactionTemplate; public void doTest() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { try { // 業務程式碼 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{ // 業務程式碼 userMapper.deleteById(200106); int i = 10/0; platformTransactionManager.commit(transaction); }catch (Exception e){ platformTransactionManager.rollback(transaction); } }
Spring主要通過兩種方式實現宣告式事務管理:
基於註解的宣告式事務管理
基於XML的宣告式事務管理
註解的事務管理主要靠@Transactional
註解來實現的。
@Transactional
註解可以作用於類或方法上,作用於類上時,該類的所有public
方法都具有該事物屬性
@Transactional
註解只應該被應用到public
修飾的方法上,這是有Spring AOP的本質決定的
@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對事務的操作主要通過PlatformTransactionManager
介面,通過這個介面,Spring為各大平臺提供了對應的事務管理器,如 JDBC(org.springframework.jdbc.datasource.DataSourceTransactionManager )等。
在Spring框架中,事務管理相關的最重要的三個介面如下:
PlatformTransactionManager
public interface PlatformTransactionManager extends TransactionManager { // 根據指定的傳播行為,該方法返回當前活動事務或建立一個新的事務 TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException; // 提交指定的事務和關於它的狀態 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事務管理的五大屬性:隔離級別、傳播行為、超時時間、是否唯讀、回滾規則
在TransactionDefinition
介面中定義了事務的隔離級別、傳播行為、超時時間的常數
public interface TransactionDefinition { // 當前存在事務,則加入該事務;如果當前沒有事務,則建立一個新的事務 int PROPAGATION_REQUIRED = 0; // ~,~,~,則繼續以非事務的方式執行 int PROPAGATION_SUPPORTS = 1; // ~,~,~,則丟擲異常 int PROPAGATION_MANDATORY = 2; // 建立一個新事務,如果當前存在事務,則把當前事務掛起 int PROPAGATION_REQUIRES_NEW = 3; // 以非事務的方式執行,如果當前存在事務,則把當前事務掛起 int PROPAGATION_NOT_SUPPORTED = 4; // 以非事務的方式執行,如果當前存在事務,則丟擲異常 int PROPAGATION_NEVER = 5; // ~,則建立一個事務作為當前事務的巢狀事務來執行,~,則等價於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; // 預設的超時時間,單位:秒 // 所謂事務超時,就是規定一個事務允許執行的最長時間,如果超過了該時間事務還沒有執行完成,則回滾事務。 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型別
回滾規則:我們可以人為的控制事務在執行過程中丟擲某些異常時仍然提交事務,或者丟擲某些異常時回滾事務
到此這篇關於Spring超詳細講解事務的文章就介紹到這了,更多相關Spring事務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45