spring的事務是spring aop應用的典範。本文從如下幾個方面入手來看看事務在spring中是如何實現的。html
一、事務基礎知識java
二、spring事務的配置形式有哪些mysql
三、spring事務的關鍵類linux
四、問題面試
#事務基礎知識 ##數據庫層面的事務 說到事務,咱們腦海裏就應該出現事務的四個特性spring
原子性、隔離性、一致性、持久性。 'sql
四種隔離 級別數據庫
一、序列化:串行化微信
二、可重複讀:可重複讀(會出現幻讀)mybatis
三、讀已提交:讀已提交數據(會出現不可重複讀和幻讀)
四、讀未提交:讀未提交數據(會出現髒讀,不可重複讀和幻讀)
##spring層面的事務 spring層面的事務和mysql的事務有所不一樣。
四個特性
原子性、隔離性、一致性、持久性。
五種隔離級別
ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.
另外四個與JDBC的隔離級別相對應
ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務能夠看到這個事務未提交的數據。
這種隔離級別會產生髒讀,不可重複讀和幻像讀。
ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交後才能被另一個事務讀取。另一個事務不能讀取該事務未提交的數據
ISOLATION_REPEATABLE_READ: 這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能出現幻像讀。
它除了保證一個事務不能讀取另外一個事務未提交的數據外,還保證了避免下面的狀況產生(不可重複讀)。
ISOLATION_SERIALIZABLE 這是花費最高代價可是最 可靠的事務隔離級別。事務被處理爲順序執行。 除了防止髒讀,不可重複讀外,還避免了幻像讀。
七種傳播特性
PROPAGATION_REQUIRED: 若是存在一個事務,則支持當前事務。若是沒有事務則開啓。
PROPAGATION_SUPPORTS: 若是存在一個事務,支持當前事務。若是沒有事務,則非事務的執行。
PROPAGATION_MANDATORY: 若是已經存在一個事務,支持當前事務。若是沒有一個活動的事務,則拋出異常。
PROPAGATION_REQUIRES_NEW: 老是開啓一個新的事務。若是一個事務已經存在,則將這個存在的事務掛起。
PROPAGATION_NOT_SUPPORTED: 老是非事務地執行,並掛起任何存在的事務。
PROPAGATION_NEVER: 老是非事務地執行,若是存在一個活動事務,則拋出異常。
PROPAGATION_NESTED:若是一個活動的事務存在,則運行在一個嵌套的事務中. 若是沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。
spring的事務都是方法級別的。
#spring事務的配置形式有哪些
曾經有一個面試官問spring的事務都有哪些形式的配置?因此平時工做當中不能就配置一種就知道一種。要多多研究其實現原理。
spring的事務Transaction配置有三種形式。
一、直接將bean代理到事務中。主要將咱們的接口和實現類注入到TransactionProxyFactoryBean實例中。
二、使用攔截器TransactionInterceptor攔截請求。
三、註解形式
具體配置見文章: http://www.blogjava.net/robbie/archive/2009/04/05/264003.html
#spring事務的關鍵類
###PlatformTransactionManager
事務管理器接口。全部的事務管理器都要實現該接口。咱們通常使用的是
DataSourceTransactionManager。
###TxNamespaceHandler
spring事務的標籤解析類。該類初始化了tx標籤中的解析類。
public void init() { registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser()); registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser()); registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser()); }
spring事務的配置都須要這些解析類解析,將信息放到對應類的變量中去。
###TransactionDefinition 事務定義。事務的傳播特性、隔離特性、只讀特性、 超時特性和名稱都在該接口類定義了。 實現類DefaultTransactionDefinition將事務的四個 特性指定了默認值。
private int propagationBehavior = PROPAGATION_REQUIRED; private int isolationLevel = ISOLATION_DEFAULT; private int timeout = TIMEOUT_DEFAULT; private boolean readOnly = false;
###TransactionStatus 事務狀態類。事務的狀態都是經過這個類獲取。實現類有兩個。
一、DefaultTransactionStatus
二、SimpleTransactionStatus
###SavepointManager
斷點管理器。建立節點、釋放節點和回滾節點操做的集合。 #問題
##問題1
spring管理事務,和數據庫的事務有何聯繫和區別。
說道聯繫:
spring的事務管理就是將咱們平時寫的事務代碼和事務邏輯封裝了。這樣spring事務實際上是在開發者和數據庫之間作了一個封裝。spring操做數據庫的事務最終實現仍是數據庫的事務操做。這是事務的邏輯按照咱們本身配置的來。
好比:咱們配置某個方法的傳播特性和隔離級別分別爲REQUIRED、 ISOLATION_READ_COMMITTED。那麼在執行該方法時候會執行事務攔截器。攔截器會根據咱們配置的隔離級別,將connection的隔離級別配置成ISOLATION_READ_COMMITTED,而後在提交鏈接執行sql。
說道區別:
spring事務裏面的傳播特性是針對spring自身的方法而言的。spring的傳播特性有七種。傳播特性是說若是某個受事務管理的方法中又調用了其餘方法,那個方法也要涉及到sql執行的操做,那麼事務如何處理。
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; 不支持當前事務,若是當前有事務則拋異常。
int PROPAGATION_NESTED = 6;
當前事物存在,則在當前事務的嵌套事務中執行。
##問題2 spring裏面的事務的組織思想
spring的事務是針對方法級別的。這一點能夠從TransactionInterceptor實現了MethodInterceptor接口中看出來。
spring的事務配置也是多種多樣的。咱們
可使用它的事物模板TransactionTemplate。
可使用註解標籤tx:annotation-driven。
可使用事務代理類 TransactionProxyFactoryBean。
可使用aop配置切面advice和攔截點(pointcut)。
無論哪一個最後都要先走事務攔截器去初始化一個鏈接。後續hibernate或者mybatis都須要找到這個鏈接去執行sql。在執行sql後,不管跑錯誤也好仍是正常執行也好都是須要根據咱們配置的事務特性進行後續操做。
參考文獻 http://www.blogjava.net/robbie/archive/2009/04/05/264003.html
http://blog.csdn.net/yaerfeng/article/details/28390773
http://www.linuxidc.com/Linux/2011-12/50178.htm
http://www.cnblogs.com/dyllove98/archive/2013/06/25/3155413.html
歡迎加入qq羣: 122567875 歡迎關注微信公衆號:hyssop的後花園