-
Spring事務管理的兩種方式
【1】編程式的事務管理:手動在程序中編寫代碼實現事務管理,實際應用中很少使用,通過TransactionTemplate管理事務。
【2】聲明式的事務管理:使用XML配置實現事務管理,推薦使用(代碼侵入性最?。?,Spring的聲明式事務管理是通過AOP實現的(沒有代碼之前開啟事務,代碼完成后提交事務)。
搭建事務管理環境(模擬轉賬環境)
【a】創建表及插入記錄
【b】創建項目并引入jar包
【c】引入log4j.properties、applicationContext.xml、jdbc.properties配置文件。
【e】創建包結構,編寫Dao及Service
【f】spring配置文件編寫
【g】Dao中獲取JDBC模板
首先Dao實現類需要繼承JdbcDaoSupport類,該類中就會注入JDBC模板,該類中定義了JDBC模板,并提供set方法只要Dao中注入模板就可以
。也可以通過注入連接池獲取JDBC模板。
【h】Dao方法具體編寫
【i】Service中注入Dao,并調用Dao中的方法
【k】測試:由于Junit4和spring整合的包已經引入,所以通過注解@ContextConfiguration注解加載配置文件,這里使用注解@Resource(name="")方式注入AccountService。
查看全部 -
TransactionStatus接口介紹
TransactionStatus接口:提供了獲取事務狀態的方法(例如:hasSavepoint()事務是否有保存點,isCompleted()事務是否已經完成,isNewTransaction()是否是新的事務)。
查看全部 -
TransactionDefinition定義事務傳播行為
事務的傳播行為:解決業務層方法之間相互調用的問題(一個service層里的方法調用另一個service里中的方法,這兩個service中又分屬于兩個不同的事務,傳播行為就是為了解決方法調用時事務的傳遞)。
事務的傳播行為有7種,可以為3類:
第一類為前三個,重點掌握第一個(在相同事務里):支持當前事務(Service中bbb()調用Service中aaa()方法時,如果aaa()有事務,則使用該事務。如果沒有事務,則使用bbb()當前事務,如果當前bbb()也沒有事務,就會新創建一個事務)
第二類為接下來三個,重點掌握第一個(在不同事務中):如果aaa()有事務存在,掛起當前事務,創建一個新的事務(aaa()和bbb()不在一個事務中)。
第三類:如果當前事務存在,則嵌套事務執行(執行aaa()完后,會使用事務的保存點,在執行bbb()時如果發生異常,可以回滾到設置的保存點,也可以回滾到最初始的狀態)。
查看全部 -
TransactionDefinition定義事務隔離級別
TransactionDefinition接口:通過Spring的API可以知道該接口提供了一組常量。
如下圖以ISOLATION開頭的五個隔離級別。
如下圖以PROPAGATION_MANDATORY開頭的7個傳播行為。
如下圖以TIMEOUT開頭的超時信息
該接口還提供了一些方法,例如:獲得隔離級別、獲得超時信息、獲得是否只是只讀的等。
如果不考慮隔離性,就會引發安全問題:臟讀、不可重復讀、以及虛讀或者叫做幻讀。
臟讀:一個事務讀取了另一個事務改寫但還未提交的數據,如果這些數據被回滾,則讀到的數據是無效的。
不可重復讀:同一事務中,多次讀取同一數據返回的結果有所不同(讀取到另一個事務已經提交的更新的數據)。
幻讀:一個事務讀取了幾行記錄后,另一個事務插入一些記錄,幻讀就發生了。再后來的查詢中,第一個事務就會發現有些原來沒有的記錄。
正常情況下,數據庫提供了四種隔離級別:
READ_UNCOMMITED:安全級別最低,如果設置為該級別,就可能會發生臟讀、不可重復讀、幻讀等。
READ_COMMITED:如果設置該級別,可以避免臟讀的發生,但是可能會發生不可重復讀和幻讀。
REPEATABLE_READ:如果設置該級別,可以避免臟讀和不可重復讀,但是可能會發生幻讀。
SERIALIZABLE:事務是串行的,不會發生并發訪問這種情況
Spring提供了DEFAULT,它代表使用數據庫默認的隔離級別(例如:Mysql默認采用REPEATABLE_READ隔離級別,Oracle默認采用READ_COMMITTED隔離級別)。
查看全部 -
PlatformTransactionManager接口介紹:
通過Spring的API可以知道該接口有許多實現類例如:DataSourceTransactionManager、HibernateTransactionManager等。Spring會為不同的持久化框架提供了不同PlatformTransactionManager接口實現。
比如當我們使用SpringJDBC或者iBatis進行持久化數據時使用DataSourceTransactionManager。
通常我們使用的是DataSourceTransactionManager和HibernateTransactionManager。
查看全部 -
Spring中的事務管理:Spring提供了一組接口進行事務的管理。
Spring提供事務管理的3個接口:
【1】PlatformTransactionManager:事務管理器,用來管理事務的接口,定義了事務的提交、回滾等方法。
【2】TransactionDefinition:事務定義信息(隔離級別、傳播行為、是否超時、是否只讀)
【3】TransactionStatus:事務具體運行狀態(事務是否提交,事務是否有保存點,事務是否是新事物等狀態)。
Spring事務管理時,這三個接口是有聯系的,Spring首先會根據事務定義信息TransactionDefinition獲取信息,然后由事務管理器PlatformTransactionManager進行管理,在事務管理過程中,會產生一個事務的狀態,這個狀態就保存在事務具體運行狀態TransactionStatus中了。
查看全部 -
事務的基本概念:事務指的是邏輯上的一組操作,這組操作要么全部成功,要么全部失敗。
事務的特性:原子性、一致性、隔離性、持久性。
原子性:事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。
一致性:事務前后數據的完整性必須保持一致。
隔離性:多個用戶并發訪問數據庫時,一個用戶的事務不能被其他用戶的事務所干擾,多個并發事務之間數據要相互隔離(數據庫中相應的數據隔離級別,通過它避免事務間的沖突)。
持久性:一個事務一旦被提交,它對數據庫中數據的改變是永久性的,即使數據庫發生故障也不應該對其有任何影響。
查看全部 -
在需要使用事務的業務實現類前添加 @Transactional 注解,便可引入到事務管理中,同時事務的傳播行為、隔離級別等都存在于@Transactional 注解的屬性中,根據需求聲明賦值便可!
查看全部 -
聲明式事務管理中,基于注解的方式實現:
默認需要配置 org.springframeword.jdbc.datasource.DataSourceTransactionManager 外;
只需要添加開啟注解事務的配置即可:
<tx:annotatioon-drivern transaction-manager="transactionManager">
查看全部 -
此處業務層的代理 的配置 基于? TransactionProxyFactoryBean 類進行了增強操作,主要操作,通過配置目標對象,將事務管理器注入并配置響應的事務屬性,在 <property><props></props></property>中配置實際需要增強的功能,即事務的傳播行為;隔離級別只讀,異?;貪L處理等....
注意: 業務功能增強是在本配置中實現,通過配置目標對象<property name="target" ref="accountService">將業務接口引入,并在當前配置中做增強;因此真正具有增強功能的 是? "accountServiceProxy" 這個類,在引入 業務接口時需要通過 @Resource 引入 "accountServiceProxy"
查看全部 -
此處的accountService類沒有被增強過;實際增強的類是配置業務層的的代理中的 “id= accountServiceProxy”類<br/>查看全部
-
本方法需要在業務接口上注入代理類,如圖中, @Resource(name="accountServicceProxy")
private AccountService accountService;
查看全部 -
聲明式事務管理中,基于TransactionProxyFactoryBean的XML方式實現:
默認需要配置 org.springframeword.jdbc.datasource.DataSourceTransactionManager 外;
還要配置具體的業務層的代理,即事務代理的主要項:
org.springframeword.transaction.interceptor.TransactionProxyFactoryBean
查看全部 -
事務的通知中,可以增強的具體內容有以下幾點:
事務傳播行為;
事務隔離級別;
只讀;
發生哪些異?;貪L;
發生哪些異常不回滾
查看全部 -
使用aop:config配置切入點,使用aop:pointcut?? 的 id 作為切入點的 坐標;調用 aop:advisor 配置切面,引入事務的增強? -- "txAdvice",將其指向要生效的切入點 -- "pointcut1";當excution 中對應的方法被調用時,該切入點會被配置的事務進行增強查看全部
舉報