@Transactional 詳解

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。


@Transactional 是聲明式事務管理 編程中使用的注解

1 .添加位置

1)接口實現類或接口實現方法上,而不是接口類中。
2)訪問權限:public 的方法才起作用。@Transactional 注解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的。
系統設計:將標簽放置在需要進行事務管理的方法上,而不是放在所有接口實現類上:只讀的接口就不需要事務管理,由于配置了@Transactional就需要AOP攔截及事務的處理,可能影響系統性能。

3)錯誤使用:

1.接口中A、B兩個方法,A無@Transactional標簽,B有,上層通過A間接調用B,此時事務不生效。2.接口中異常(運行時異常)被捕獲而沒有被拋出。默認配置下,spring 只有在拋出的異常為運行時 unchecked 異常時才回滾該事務,也就是拋出的異常為RuntimeException 的子類(Errors也會導致事務回滾),而拋出 checked 異常則不會導致事務回滾 。可通過 @Transactional rollbackFor進行配置。3.多線程下事務管理因為線程不屬于 spring 托管,故線程不能夠默認使用 spring?的事務,也不能獲取spring 注入的 bean 。在被 spring 聲明式事務管理的方法內開啟多線程,多線程內的方法不被事務控制。一個使用了@Transactional 的方法,如果方法內包含多線程的使用,方法內部出現異常,不會回滾線程中調用方法的事務。


2.聲明式事務管理實現方式:
基于 tx 和 aop 名字空間的 xml 配置文件

// 基本配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:task="http://www.springframework.org/schema/task" xmlns:jms="http://www.springframework.org/schema/jms"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsdhttp://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd"><bean name="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="shardingDataSource"></property></bean><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />// MyBatis 自動參與到 spring 事務管理中,無需額外配置,
只要 org.mybatis.spring.SqlSessionFactoryBean 引用的數據源與
DataSourceTransactionManager 引用的數據源一致即可,否則事務管理會不起作用。// <annotation-driven> 標簽的聲明,
是在 Spring 內部啟用 @Transactional 來進行事務管理,使用 @Transactional 前需要配置。


3. @Transactional注解
@Transactional 實質是使用了 JDBC 的事務來進行事務控制的
@Transactional 基于 Spring 的動態代理的機制
?

@Transactional 實現原理:1) 事務開始時,通過AOP機制,生成一個代理connection對象,并將其放入 DataSource 實例的某個與 DataSourceTransactionManager 相關的某處容器中。在接下來的整個事務中,客戶代碼都應該使用該 connection 連接數據庫,執行所有數據庫命令。[不使用該 connection 連接數據庫執行的數據庫命令,在本事務回滾的時候得不到回滾](物理連接 connection 邏輯上新建一個會話session;DataSource 與 TransactionManager 配置相同的數據源)2) 事務結束時,回滾在第1步驟中得到的代理 connection 對象上執行的數據庫命令,然后關閉該代理 connection 對象。(事務結束后,回滾操作不會對已執行完畢的SQL操作命令起作用)


4.聲明式事務的管理實現本質:
事務的兩種開啟方式:
? ? ? 顯示開啟 start transaction | begin,通過 commit | rollback 結束事務
? ? ? 關閉數據庫中自動提交 autocommit set autocommit = 0;MySQL 默認開啟自動提交;通過手動提交或執行回滾操作來結束事務


Spring 關閉數據庫中自動提交:在方法執行前關閉自動提交,方法執行完畢后再開啟自動提交

?// org.springframework.jdbc.datasource.DataSourceTransactionManager.java 源碼實現// switch to manual commit if necessary. this is very expensive in some jdbc drivers,// so we don't want to do it unnecessarily (for example if we've explicitly// configured the connection pool to set it already).if (con.getautocommit()) {txobject.setmustrestoreautocommit(true);if (logger.isdebugenabled()) {logger.debug("switching jdbc connection [" + con + "] to manual commit");}con.setautocommit(false);}

問題:

關閉自動提交后,若事務一直未完成,即未手動執行 commit 或 rollback 時如何處理已經執行過的SQL操作?

C3P0 默認的策略是回滾任何未提交的事務
C3P0 是一個開源的JDBC連接池,它實現了數據源和 JNDI 綁定,支持 JDBC3 規范和 JDBC2 的標準擴展。目前使用它的開源項目有 Hibernate,Spring等
JNDI(Java Naming and Directory Interface,Java命名和目錄接口)是SUN公司提供的一種標準的Java命名系統接口,JNDI提供統一的客戶端API,通過不同的訪問提供者接口JNDI服務供應接口(SPI)的實現,由管理者將JNDI API映射為特定的命名服務和目錄系統,使得Java應用程序可以和這些命名服務和目錄服務之間進行交互

-------------------------------------------------------------------------------------------------------------------------------
5. spring 事務特性
spring 所有的事務管理策略類都繼承自 org.springframework.transaction.PlatformTransactionManager 接口

public interface PlatformTransactionManager {TransactionStatus getTransaction(TransactionDefinition definition)throws TransactionException;void commit(TransactionStatus status) throws TransactionException;void rollback(TransactionStatus status) throws TransactionException;
}

事務的隔離級別:是指若干個并發的事務之間的隔離程度

1. @Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數據(會出現臟讀,不可重復讀) 基本不使用2. @Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數據(會出現不可重復讀和幻讀)3. @Transactional(isolation = Isolation.REPEATABLE_READ):可重復讀(會出現幻讀)4. @Transactional(isolation = Isolation.SERIALIZABLE):串行化

事務傳播行為:如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為

1. TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是默認值。2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。3. TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。5. TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。6. TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。7. TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。



上表字段說明:

1. value :主要用來指定不同的事務管理器;主要用來滿足在同一個系統中,存在不同的事務管理器。比如在Spring中,聲明了兩種事務管理器txManager1, txManager2.然后,用戶可以根據這個參數來根據需要指定特定的txManager.2. value 適用場景:在一個系統中,需要訪問多個數據源或者多個數據庫,則必然會配置多個事務管理器的3. REQUIRED_NEW:內部的事務獨立運行,在各自的作用域中,可以獨立的回滾或者提交;而外部的事務將不受內部事務的回滾狀態影響。4. ESTED 的事務,基于單一的事務來管理,提供了多個保存點。這種多個保存點的機制允許內部事務的變更觸發外部事務的回滾。而外部事務在混滾之后,仍能繼續進行事務處理,即使部分操作已經被混滾。 由于這個設置基于 JDBC 的保存點,所以只能工作在 JDB C的機制。5. rollbackFor:讓受檢查異常回滾;即讓本來不應該回滾的進行回滾操作。6. noRollbackFor:忽略非檢查異常;即讓本來應該回滾的不進行回滾操作。

6.其他:

1. 事務方法的嵌套調用會產生事務傳播。
2. spring 的事務管理是線程安全的
3. 父類的聲明的 @Transactional 會對子類的所有方法進行事務增強;子類覆蓋重寫父類方式可覆蓋其 @Transactional 中的聲明配置。4. 類名上方使用 @Transactional,類中方法可通過屬性配置來覆蓋類上的 @Transactional 配置;比如:類上配置全局是可讀寫,可在某個方法上改為只讀。

如果不對運行時異常進行處理,那么出現運行時異常之后,要么是線程中止,要么是主程序終止。?
如果不想終止,則必須捕獲所有的運行時異常,決不讓這個處理線程退出。隊列里面出現異常數據了,正常的處理應該是把異常數據舍棄,然后記錄日志。不應該由于異常數據而影響下面對正常數據的處理。


非運行時異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類。如IOException、SQLException等以及用戶自定義的Exception異常。對于這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行catch并處理,否則程序就不能編譯通過。所以,面對這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。


---------------------?

轉自:https://blog.csdn.net/mingyundezuoan/article/details/79017659?

https://www.cnblogs.com/clwydjgs/p/9317849.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448303.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LiveGBS高性能GB28181國標流媒體服務流傳輸模式支持UDP、TCP被動、TCP主動模式

LiveGBS國標(GB28181)流媒體服務軟件&#xff1a; 提供用戶管理及Web可視化頁面管理&#xff1b; 提供設備狀態管理&#xff0c;可實時查看設備是否掉線等信息&#xff1b; 實時流媒體處理&#xff0c;PS&#xff08;TS&#xff09;轉ES&#xff1b; 設備狀態監測、云臺控制、錄…

通過人行橫道線

學車中的通過人行橫道線 人行橫道線&#xff0c;俗稱斑馬線&#xff0c;是由一條一條的白色線組成的&#xff0c;主要是用來讓行人穿越馬路的。 駕駛員駕駛車輛通過人行橫道時應該減速緩行&#xff0c;注意禮讓行人。 考核要求 當駕車進入路面有施劃人行橫道線的&#xf…

python學習-38迭代器和生成器

迭代器和生成器---- 迭代器協議和for循環工作機制1.迭代器協議&#xff1a;對象必須提供一個next方法&#xff0c;執行該方法要么返回迭代中的下一項&#xff0c;要么引起一個Stoplteration異常&#xff0c;以終止迭代&#xff08;只能往后走&#xff0c;不能往前走&#xff09…

[轉載]基于Aaf的數據拆分

(本文適于使用Aaf框架的開發者閱讀) 1. 基本原理 在Aaf框架中&#xff0c;“對象”和“存儲”的關系映射有一個關鍵的紐帶StorageAlias&#xff0c;即“存儲別名”&#xff0c;同樣一個類型&#xff0c;在不同的存儲別名下&#xff0c;可以自由映射到任意存儲“位置”。  “位…

靠邊停車

什么是靠邊停車 靠邊停車是大路考中一個指標很明確的考核項目&#xff0c;要求學員駕駛車輛使之靠邊停下。 操作方法 1、停車前&#xff0c;要通過內、外后視鏡觀察后方和右側交通情況&#xff0c;開右轉向燈。 2、適量踩下制動踏板。 3、向右轉動方向盤(第一把輪…

RuntimeException 和 Exception 區別、異常的子父級關系

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.java 將所有的錯誤封裝為一個對象&#xff0c;其根本父類為Throwable, Throwable 有兩個子類&#xff1a;Error 和 Exception。 2.Err…

通過路口

操作方法 1、讓車減速 2、觀察路口的情況 3、通過路口 注意事項 1、不要搶黃燈 2、不要開英雄車&#xff0c;即紅燈亮起時通過路口的最后一輛車 3、控制車速&#xff0c;控制在50km/h以下 4、看到左右車都減速時&#xff0c;也馬上減速 5、要左轉…

C語言筆記(關鍵字)

gdb調試 gcc 源程序 -g&#xff1b;加gdb調試信息gdb可執行程序&#xff1b;&#xff08;gdb調試&#xff09;l&#xff08;ist&#xff09;&#xff1a;查看源碼&#xff0c;按一下從main開始10行以此往后l n&#xff1a;查看n處上下10行的源碼run&#xff1a;運行程序b&…

自定義 Git - Git 鉤子 (自動部署)

Git 鉤子 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 和其它版本控制系統一樣&#xff0c;Git 能在特定的重要動作發生時觸發自定義腳本。 有兩組這樣的鉤子&#xff1a;客戶端的和…

變更車道

操作方法 1、觀察與判斷觀察車輛后方、側方和準備變更的車道上的交通流情況&#xff1b; 2、確認安全后&#xff0c;打開轉向指示燈示意&#xff0c;并再次通過后視鏡觀察兩側道路上有無車輛超越&#xff0c;確認準備駛入的車道是否允許留有安全距離&#xff1b; 3…

C語言筆記(符號)

注釋符號 幾個似非而是的注釋問題 例子&#xff1a; (A) int / * ... * /i; (B) char * s "abcdefgh //hijklmn"; (C) //Is it a \valid comment? (D) in/ * ... * /t i; 我們知道C語言里可以有兩種注釋方式&#xff1a;“/* */” 和 “ // ”。那么上面幾條…

直線行駛

考核要求 保證跟車安全速度和安全距離&#xff0c;了解車輛行駛速度、注意觀察路面狀況&#xff0c;采取相應措施。不能有左右擺動、方向不穩的現象。 考試口訣 一.尋找中心 二.雙眼鎖定本車能通行的中心 三.心理想著走中間 四.雙眼從本車前面最突出點的.中心…

java 命令: jmap 命令使用 ( 查看內存使用、設置 )

jdk安裝后會自帶一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節。 jmap命令可以獲得運行中的jvm的堆的快照&#xff0c;從而可以離線分析堆&#xff0c;以檢查內存泄漏&am…

第一節 接口概述 [轉貼]

接口&#xff08;interface&#xff09;用來定義一種程序的協定。實現接口的類或者結構要與接口的定義嚴格一致。有了這個協定&#xff0c;就可以拋開編程語言的限制&#xff08;理論上&#xff09;。接口可以從多個基接口繼承&#xff0c;而類或結構可以實現多個接口。接口可以…

獲取本機用戶名、MAC地址、IP地址、硬盤ID、CPU序列號、系統名稱、物理內存

我們在利用C#開發桌面程序&#xff08;Winform&#xff09;程序的時候&#xff0c;經常需要獲取一些跟系統相關的信息&#xff0c;例如用戶名、MAC地址、IP地址、硬盤ID、CPU序列號、系統名稱、物理內存等。 首先需要引入命名空間&#xff1a; using System.Management; //…

只用一套解決方案,就可解決80%的交通物流行業信息難題

行業背景 新中國成立70多年來&#xff0c;中國交通運輸總體上已經形成了多節點、全覆蓋的綜合運輸網絡&#xff0c;“五縱五橫”綜合運輸大通道基本貫通&#xff0c;一大批綜合客運、貨運樞紐站場&#xff08;物流園區&#xff09;投入運營&#xff0c;取得了一系列矚目成果&am…

起步

什么是開車起步 起步&#xff0c;即發動汽車&#xff0c;使汽車開始走動。 操作方法 1、“踩”離合器 2、“掛”一檔 3、“打”左轉向燈&#xff08;提醒后車駕駛員注意安全避讓&#xff09; 4、“鳴”號&#xff08;引起車輛周圍的行人或機動車等注意&…

Linux 使用 jstat 命令查看 jvm 的 GC 情況

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Options&#xff0c;選項&#xff0c;我們一般使用 -gcutil 查看gc情況 vmid&#xff0c;VM的進程號&#xff0c;即當前運行的java進程號…

WKWebview加載本地圖片時出現路徑問題

出現問題情況是&#xff1a;將uiwebview換成wkwebview之后&#xff0c;之前將webview上那些圖片放回本地下載后緩存的圖片沒辦法在webview上找到&#xff0c;最后排查出原因是&#xff0c;wkwebview需要將圖片和網頁文件放在同個路徑下。 具體實現方法如下(獲取圖片緩存的路徑&…

上車準備

上車準備一 1、環視車輛、確保安全。 2、調整駕駛座。身體坐正&#xff0c;雙手向前伸直&#xff0c;以手腕剛好能放在方向盤上為準。左腳擱在離合器上&#xff0c;右腳擱在剎車上&#xff0c;小腿和大腿成90度。左腳可以輕松把離合器踩到底。身體離方向盤20—25厘米。 …