自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring聲明式事務(wù)

開發(fā) 后端
本文介紹Spring聲明式事務(wù),以及Spring事務(wù)管理的核心接口和在TransactionDefinition接口中定義了七個事務(wù)傳播行為。

Spring聲明式事務(wù)讓我們從復(fù)雜的事務(wù)處理中得到解脫。使得我們再也無需要去處理獲得連接、關(guān)閉連接、事務(wù)提交和回滾等這些操作。再也無需要我們在與事務(wù)相關(guān)的方法中處理大量的try…catch…finally代碼。
我們在使用Spring聲明式事務(wù)時,有一個非常重要的概念就是事務(wù)屬性。事務(wù)屬性通常由事務(wù)的傳播行為,事務(wù)的隔離級別,事務(wù)的超時值和事務(wù)只讀標(biāo)志組成。我們在進(jìn)行事務(wù)劃分時,需要進(jìn)行事務(wù)定義,也就是配置事務(wù)的屬性。
Spring在TransactionDefinition接口中定義這些屬性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事務(wù)管理的核心接口。

  1. TransactionDefinition      
  2. public interface TransactionDefinition {      
  3. int getPropagationBehavior();      
  4.     int getIsolationLevel();      
  5.     int getTimeout();      
  6.     boolean isReadOnly();      

getTimeout()方法,它返回事務(wù)必須在多少秒內(nèi)完成。isReadOnly(),事務(wù)是否只讀,事務(wù)管理器能夠根據(jù)這個返回值進(jìn)行優(yōu)化,確保事務(wù)是只讀的。getIsolationLevel()方法返回事務(wù)的隔離級別,事務(wù)管理器根據(jù)它來控制另外一個事務(wù)可以看到本事務(wù)內(nèi)的哪些數(shù)據(jù)。 


1、ISOLATION_DEFAULT
2、ISOLATION_READ_UNCOMMITTED
3、ISOLATION_READ_COMMITTED
4、ISOLATION_REPEATABLE_READ
5、ISOLATION_SERIALIZABLE

1、ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認(rèn)的隔離級別,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別.另外四個與JDBC的隔離級別相對應(yīng)
2、ISOLATION_READ_UNCOMMITTED 這是事務(wù)最低的隔離級別,它充許別外一個事務(wù)可以看到這個事務(wù)未提交的數(shù)據(jù)。這種隔離級別會產(chǎn)生臟讀,不可重復(fù)讀和幻像讀。
例如:
Mary的原工資為1000,財(cái)務(wù)人員將Mary的工資改為了8000,但未提交事務(wù)  

  1. Connection con1 = getConnection();      
  2. con.setAutoCommit(false);      
  3. update employee set salary = 8000 where empId ="Mary";  

與此同時,Mary正在讀取自己的工資

  1. Connection con2 = getConnection();      
  2. select   salary from employee where empId ="Mary";      
  3. con2.commit();  


Mary發(fā)現(xiàn)自己的工資變?yōu)榱?000,歡天喜地!而財(cái)務(wù)發(fā)現(xiàn)操作有誤,而回滾了事務(wù),Mary的工資又變?yōu)榱?000

  1. //con1      
  2.    con1.rollback();   

 像這樣,Mary記取的工資數(shù)8000是一個臟數(shù)據(jù)。

3、ISOLATION_READ_COMMITTED 保證一個事務(wù)修改的數(shù)據(jù)提交后才能被另外一個事務(wù)讀取。另外一個事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。這種事務(wù)隔離級別可以避免臟讀出現(xiàn),但是可能會出現(xiàn)不可重復(fù)讀和幻像讀。

4、ISOLATION_REPEATABLE_READ 這種事務(wù)隔離級別可以防止臟讀,不可重復(fù)讀。但是可能出現(xiàn)幻像讀。它除了保證一個事務(wù)不能讀取另一個事務(wù)未提交的數(shù)據(jù)外,還保證了避免下面的情況產(chǎn)生(不可重復(fù)讀)。

在事務(wù)1中,Mary 讀取了自己的工資為1000,操作并沒有完成

  1. con1 = getConnection();      
  2. select salary from employee empId ="Mary";  

在事務(wù)2中,這時財(cái)務(wù)人員修改了Mary的工資為2000,并提交了事務(wù). 

  1. con2 = getConnection();      
  2. update employee set salary = 2000;      
  3. con2.commit();  

在事務(wù)1中,Mary 再次讀取自己的工資時,工資變?yōu)榱?000

  1. //con1      
  2. select salary from employee empId ="Mary"

在一個事務(wù)中前后兩次讀取的結(jié)果并不致,導(dǎo)致了不可重復(fù)讀。
使用ISOLATION_REPEATABLE_READ可以避免這種情況發(fā)生。

5、ISOLATION_SERIALIZABLE 這是花費(fèi)最高代價但是最可靠的事務(wù)隔離級別。事務(wù)被處理為順序執(zhí)行。除了防止臟讀,不可重復(fù)讀外,還避免了幻像讀。

目前工資為1000的員工有10人。
事務(wù)1,讀取所有工資為1000的員工。 

  1. con1 = getConnection();      
  2. Select * from employee where salary =1000  

共讀取10條記錄

這時另一個事務(wù)向employee表插入了一條員工記錄,工資也為1000

  1. con2 = getConnection();      
  2. Insert into employee(empId,salary) values("Lili",1000);      
  3. con2.commit();  

事務(wù)1再次讀取所有工資為1000的員工

  1. //con1      
  2. select * from employee where salary =1000

共讀取到了11條記錄,這就產(chǎn)生了幻像讀。
ISOLATION_SERIALIZABLE能避免這樣的情況發(fā)生。但是這樣也耗費(fèi)了最大的資源。

getPropagationBehavior()返回事務(wù)的傳播行為,由是否有一個活動的事務(wù)來決定一個事務(wù)調(diào)用。

在TransactionDefinition接口中定義了七個事務(wù)傳播行為。

1、PROPAGATION_REQUIRED
2、PROPAGATION_SUPPORTS
3、PROPAGATION_MANDATORY
4、PROPAGATION_REQUIRES_NEW
5、PROPAGATION_NOT_SUPPORTED
6、PROPAGATION_NEVER
7、PROPAGATION_NESTED

1、PROPAGATION_REQUIRED 如果存在一個事務(wù),則支持當(dāng)前事務(wù)。如果沒有事務(wù)則開啟一個新的事務(wù)。 

  1. //事務(wù)屬性 PROPAGATION_REQUIRED      
  2. methodA{      
  3. ……      
  4. methodB();      
  5. ……      
  6. }      
  7.     
  8. //事務(wù)屬性 PROPAGATION_REQUIRED      
  9. methodB{      
  10.     ……      
  11. }   

使用spring聲明式事務(wù),spring使用AOP來支持聲明式事務(wù),會根據(jù)事務(wù)屬性,自動在方法調(diào)用之前決定是否開啟一個事務(wù),并在方法執(zhí)行之后決定事務(wù)提交或回滾事務(wù)。

【編輯推薦】

  1. 當(dāng)Spring遇到Hibernate的時候
  2. 將Flex與Spring集成框架
  3. 如何集成Struts和Spring
  4. Spring2.0升級Spring2.0.7的變化
  5. Spring 2.0新功能
責(zé)任編輯:佚名 來源: JavaEye
相關(guān)推薦

2024-11-13 19:03:14

2021-09-06 13:42:14

Spring聲明式事務(wù)

2009-02-11 11:14:31

事務(wù)管理事務(wù)開始Spring

2009-02-11 13:08:29

事務(wù)提交事務(wù)管理Spring

2021-04-15 08:01:27

Spring聲明式事務(wù)

2009-06-22 11:01:12

2025-01-16 08:45:48

2011-11-23 16:28:07

JavaSpring框架

2023-04-28 08:21:36

SpringBoot聲明式事務(wù)編程式事務(wù)

2020-12-17 07:59:46

聲明式代碼命令式代碼代碼

2009-06-17 14:57:11

Spring事務(wù)管理

2022-06-21 08:12:17

K8sAPI對象Kubernetes

2009-06-08 17:56:00

SpringJDBC事務(wù)

2009-06-29 17:54:47

Spring事務(wù)隔離

2023-05-26 07:19:49

Spring聲明式事務(wù)

2022-12-26 08:34:58

SpringHttp

2011-01-27 10:11:46

J2EEjavaspring

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2025-01-26 00:00:40

Seata分布式事務(wù)

2013-06-27 09:31:37

聲明式編程命令式編程編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號