Spring事務管理總結

本文是對慕課網上"搞定SSM開發"路徑的系列課程的總結,詳細的項目文檔和課程總結放在github上了.點擊查看
本文對應慕課網上課程Spring事務管理,詳情可查看:點我git

1: 概念簡析

  • 事務:邏輯的一組操做,要麼一塊兒成功,要麼一塊兒失敗。
  • 事務的特性:
    • 原子性:不可分割,要麼都發生,要麼都不發生
    • 一致性:數據完整性保持一致
    • 隔離性:不一樣的事務操做不能相互影響 (隔離級別)
    • 持久性:事務提交後,對數據的改變是永久的

PlatformTransactionManager:
事務管理器類,不一樣持久化框架(例如JDBC,Hibernate,Mybatis|Mybatis好像使用和JDBC同同樣的事務管理器實現類)對應不一樣實現類,注意具體使用時查詢github

TransactionDefinition:
數據庫在查詢數據時,因爲種種緣由會發生如下三種問題.
  髒讀 :讀到還未修改的;
  不可重複讀:在屢次讀同一記錄過程當中,另外事務提交修改,致使讀取先後內容不一樣;
  幻讀 :和不可重複讀相似,不過另一個事務插入而非修改sql





隔離級別 : 就是爲了解決以上問題設定的事務相關的屬性
READ_UNCOMMITED
READ_COMMITTED
REPEATABLE READ
SERIALIZABLE
以上四個級別一層層更嚴格,執行效率也愈來愈低.
最後的那個級別會致使全部事務呈線性執行數據庫

傳播行爲:用來支持Spring的事務管理的屬性,肯定哪些操做會在被包含在同一個事務裏
PROPAGATION_REQUIRED 支持當前事務,若是不存在,就建立一個
PROPAGATION_SUPPORTS 具體查看相關文檔
PROPAGATION_MANDATORY 。。。。
....編程

sql執行可使用模板,也能夠拿到sqlConnection以後本身執行,可是執行模板確實是最方便的方法框架

TransactionStatus:能夠獲得當前事務的相關屬性代理

2: 編程式事務管理

1:配置事務管理器platformTransactionManager
對於jdbc 須要datasourceTransactionManager 其中必須定義數據源屬性dataSource,jdbc中是c3p0的鏈接池code

2:事務管理的模板(注意和sql模板不一樣) transactionTemplate 事務管理模板,其屬性就是上面對應的事務管理器.orm

3:在須要事務管理的代碼處使用內部匿名類來執行運行sql的代碼,這樣將全部的操做後臺的sql都會放在同一個事務中.xml

3:聲明式事務管理

1:首先仍是要配置事務管理器

2:配置事務管理具體方法

  • 經典ProxyFactoryBean(使用動態代理的技術,用法已經漸漸廢棄)
    須要配置TransactionProxyFactoryBean 屬性包括target(標註哪一個Bean須要事務管理) 和 事務管理器(上面配置的),在bean的配置中經過property來配置事務的傳播行爲和隔離級別. (只能對一個目標進行配置,就是那個target,很差用)

  • 使用aop來進行事務管理
    使用基於AspectJ的Spring AOP來管理
    xml配置:
    配置通知 <tx:advice>
    配置切面 <aop:aspect>,在切面中配置通知和切點.

  • 註解配置:
    @Transactional便可配置;對須要的類配置,同時也可配置相關的隔離級別和傳播行爲屬性.

相關的dao層配置請查看本系列文檔關於Mybatis的總結

相關文章
相關標籤/搜索