摘要:中的事務控制方式編程式事務管理通過手動編碼控制事務的邊界,可以實現細粒度的事務控制,一般用的較少。隔離級別控制并發訪問下數據庫的安全性。內部事務的回滾不會對外部事務造成影響。可能導致臟幻不可重復讀允許在并發事務已經提交后讀取。
1.事務的概念
事務是一組操作的執行單元,相對于數據庫的單條操作而言,事務管理的是一組SQL指令,如增刪改查等,事務的特性體現在事務內包含的SQL指令必須全部執行成功,如果其中一條指令發生錯誤,那么整個事務內的一組操作都要進行回滾。
事務有四個特性:
原子性 Atomic ,事務是一個不可再拆分的最小單位,要么整個執行,要么整個回滾.
一致性 Consistent,事務要保證數據庫整體數據的完整性和業務的數據的一致性,事務成功提交整體數據修改,事務錯誤則回滾到數據回到原來的狀態。
隔離性 Isolate,兩個事務的執行都是獨立的,事務之前不會相互影響,多個事務操作一個對象時會以串行等待的方式保證事務相互之間處于隔離。
持久性 Durable,一旦事務成功提交后,數據將會保存到數據庫,不能再進行回滾,以后的操作都將在當前數據庫狀態上繼續進行。
2.Spring中的事務控制方式編程式事務管理
通過手動編碼控制事務的邊界,可以實現細粒度的事務控制,一般用的較少。
聲明式事務管理
只需要在Spring中添加一些配置文件或者使用注解,即可實現將操作納入事務管理中,事務管理使用了Spring AOP,降低了代碼之間的耦合。
Spring中并沒有直接管理事務,而是將管理事務委托給相應的持久化機制提供的某個特定平臺的實現。
事務管理器實現 | 目標 |
---|---|
org.springframework.jdbc.datasource.DataSourceTransactionManager | 在單一的JDBC Datasource中管理事務 |
org.springframework.orm.hibernate5.HibernateTransactionManager | 當持久化機制是hibernate時,用它來管理事務 |
org.springframework.jdo.JdoTransactionManager | 當持久化機制是Jdo時,用它來管理事務 |
org.springframework.transaction.jta.JtaTransactionManager | 使用一個JTA實現來管理事務。在一個事務跨越多個資源時必須使用 |
org.springframework.orm.ojb.PersistenceBrokerTransactionManager | 當apache的ojb用作持久化機制時,用它來管理事務 |
Spring關于事務的注解中有以下幾個屬性(部分)
@Transactional( readOnly = false, //讀寫事務 timeout = -1, //超時 noRollbackFor = ArithmeticException.class //遇到數學異常不回滾 isolation = Isolation.REPEATABLE_READ, //事務隔離級別 propagation = Propagation.REQUIRED //事務傳播規則 )
是否為只讀事務:只讀事務不做任何修改,可以優化查詢操作。
事務超時(單位為秒):事務的最長持續時間,如果該時間內事務一直沒有操作或回滾,則系統將自動進行回滾。-1表示不超時,但最終實現需要由底層數據庫實現。
隔離級別:控制并發訪問下數據庫的安全性。
傳播規則:定義事務方法和調用事務方法的方法之間的事務邊界。
5.事務傳播規則傳播行為 | 意義 |
---|---|
REQUIRED | 業務方法需要在一個事務中運行。如果方法運行時,已經處在一個事務中,那么加入到該事務,否則為自己創建一個新的事務 |
NOT_SUPPORTED | 聲明方法不需要事務。如果方法沒有關聯到一個事務,容器不會為它開啟事務。如果方法在一個事務中被調用,該事務會被掛起,在方法調用結束后,原先的事務便會恢復執行 |
REQUIRES_NEW | 屬性表明不管是否存在事務,業務方法總會為自己發起一個新的事務。如果方法已經運行在一個事務中,則原有事務會被掛起,新的事務會被創建,直到方法執行結束,新事務才算結束,原先的事務才會恢復執行 |
MANDATORY | 該屬性指定業務方法只能在一個已經存在的事務中執行,業務方法不能發起自己的事務。如果業務方法在沒有事務的環境下調用,容器就會拋出異常 |
SUPPORTS | 這一事務屬性表明,如果業務方法在某個事務范圍內被調用,則方法成為該事務的一部分。如果業務方法在事務范圍外被調用,則方法在沒有事務的環境下執行 |
NEVER | 指定業務方法絕對不能在事務范圍內執行。如果業務方法在某個事務中執行,容器會拋出異常,只有業務方法沒有關聯到任何事務,才能正常執行 |
NESTED | 如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按REQUIRED屬性執行.它使用了一個多帶帶的事務, 這個事務擁有多個可以回滾的保存點。內部事務的回滾不會對外部事務造成影響。它只對DataSourceTransactionManager事務管理器起效 |
隔離級別 | 意義 |
---|---|
DEFAULT | 默認的隔離級別 |
READ_UNCOMMITED | 允許你讀取還未提交的改變了的數據。可能導致臟、幻、不可重復讀 |
READ_COMMITTED | 允許在并發事務已經提交后讀取。可防止臟讀,但幻讀和 不可重復讀仍可發生 |
REPEATABLE_READ | 對相同字段的多次讀取是一致的,除非數據被事務本身改變。可防止臟、不可重復讀,但幻讀仍可能發生 |
SERIALIZABLE | 完全服從事務ACID的隔離級別,確保不發生臟、幻、不可重復讀。這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的數據表來完成的 |
不同的隔離級別采用不同的方式來實現,在四種隔離級別中,Serializable的隔離級別最高,Read Uncommited的隔離級別最低。
大多數據庫默認的隔離級別為Read Commited,如SqlServer,Oracle
當然也有少部分數據庫默認的隔離級別為Repeatable_Read ,如Mysql,
Oracle數據庫支持READ COMMITTED和SERIALIZABLE兩種事務隔離性級別,不支持READ UNCOMMITTED和REPEATABLE READ這兩種隔離性級別。雖然SQL標準定義的默認事務隔離性級別是SERIALIZABLE,但是Oracle數據庫默認使用的事務隔離性級別卻是READ COMMITTED.
7.相關資料臟讀、不可重復讀、幻讀區別
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67620.html
摘要:連接對象執行命令對象執行關閉值得注意的是,對數據庫連接池是有很好的支持的。給我們提供了事務的管理器類,事務管理器類又分為兩種,因為的事務和的事務是不一樣的。 前言 上一篇Spring博文主要講解了如何使用Spring來實現AOP編程,本博文主要講解Spring的DAO模塊對JDBC的支持,以及Spring對事務的控制... 對于JDBC而言,我們肯定不會陌生,我們在初學的時候肯定寫過非...
摘要:我自己總結的學習的系統知識點以及面試問題,已經開源,目前已經。目前最新的版本中模塊的組件已經被廢棄掉,同時增加了用于異步響應式處理的組件。每一次請求都會產生一個新的,該僅在當前內有效。顯而易見,這種模式存在很多問題。 我自己總結的Java學習的系統知識點以及面試問題,已經開源,目前已經 41k+ Star。會一直完善下去,歡迎建議和指導,同時也歡迎Star: https://githu...
摘要:在框假中充當了管理容器的角色。中也有對事務的管理,中事務管理是通過創建和維護來完成。這也就是所謂控制反轉的概念所在依賴控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉。 在SSH框假中spring充當了管理容器的角色。我們都知道Hibernate用來做持久層,因為它將JDBC做了一個良好的封裝,程序員在與數據庫進行交互時可以不用書寫大量的SQL語句。Struts是用來做應用層...
摘要:中大致分為兩部分事務管理器和本地資源管理器。具體實現分布式事務框架的核心功能是對本地事務的協調控制,框架本身并不創建事務,只是對本地事務做協調控制。 Spring Cloud 分布式事務管理 在微服務如火如荼的情況下,越來越多的項目開始嘗試改造成微服務架構,微服務即帶來了項目開發的方便性,又提高了運維難度以及網絡不可靠的概率. @[toc]在說微服務的優缺點時,有對比才會更加明顯,首先...
閱讀 3477·2023-04-26 02:31
閱讀 3635·2021-11-23 09:51
閱讀 1298·2021-11-17 09:33
閱讀 2449·2021-11-16 11:45
閱讀 2578·2021-10-11 11:12
閱讀 2423·2021-09-22 15:22
閱讀 2724·2021-09-04 16:40
閱讀 2589·2021-07-30 15:30