1. 程式人生 > >spring源碼之事務上篇

spring源碼之事務上篇

sql ram 知識 ref sdn 全部 鏈接 帳戶 pri

前言

本篇之前,已經寫過關於AOP的源碼分析,在此基礎上來閱讀事務的源碼是比較清晰的。另外,需要對數據庫有一定的了解,我們所說是事務一般指的都是狹義的事務,即數據庫事務。文中沒有特別指出的數據庫,均指的是mysql,後面再來寫一篇關於mysql的鎖和事務的文章。

概述

事務指的是一個程序執行單元,這個執行單元要麽成功,要麽失敗,絕對不允許存在中間狀態,它是我們恢復和並發控制的基本單位。

學習事務時,一般會拿轉錢來做說明,這裏也拿張三向李四轉100元來說明,這個過程分為兩步,張三帳戶減100,李四帳戶加100.

事務的四個特性(ACID)

  • 原子性:事務由一系列操作來完成,要麽保證這一系列操作同時起作用,要到全部不起作用。以例子來說,張三減100,李四加100。要同時成功或失敗,不然就不滿足原子性。
  • 一致性:從一個數據庫狀態轉變到別一個狀態。一致性和原子性,經常會讓人認為是一個東西,個人理解一致性是從狀態變化的角度來看問題,即結果,而原子性更偏向於過程來看問題。以例子來說,這裏的狀態就是轉帳前後,張三和李四總的資金數沒有發生變化。可以說原子性保證了一致性。
  • 隔離性:並發執行的事務是相互隔離的。以例子來說,假設張三帳戶有1000元,他同時向王五也轉帳100,轉給李四時,他的戶頭上扣了100,就只有900了,轉給王五是,再扣100,只有800了,如果李四收錢時出了問題,而王五收錢成功,這時把800寫入到數據庫。張三就會很生氣,因為帳戶被多扣了100。這個就是有問題的。
  • 持久性:事務完成,不論發生什麽,都不會對操作有影響。

知識點

學習spring事務時,我們一般會從事務特性、隔離級別、傳播行為三個進行分析

  • 事務的四個特性

  學習事務時,一般會拿轉錢來做說明,這裏也拿張三向李四轉100元來說明,這個過程分為兩步,張三帳戶減100,李四帳戶加100.

  事務的四個特性(ACID)

    • 原子性:事務由一系列操作來完成,要麽保證這一系列操作同時起作用,要到全部不起作用。以例子來說,張三減100,李四加100。要同時成功或失敗,不然就不滿足原子性。
    • 一致性:從一個數據庫狀態轉變到別一個狀態。一致性和原子性,經常會讓人認為是一個東西,個人理解一致性是從狀態變化的角度來看問題,即結果,而原子性更偏向於過程來看問題。以例子來說,這裏的狀態就是轉帳前後,張三和李四總的資金數沒有發生變化。可以說原子性保證了一致性。
    • 隔離性:並發執行的事務是相互隔離的。以例子來說,假設張三帳戶有1000元,他同時向王五也轉帳100,轉給李四時,他的戶頭上扣了100,就只有900了,轉給王五是,再扣100,只有800了,如果李四收錢時出了問題,而王五收錢成功,這時把800寫入到數據庫。張三就會很生氣,因為帳戶被多扣了100。這個就是有問題的。
    • 持久性:事務完成,不論發生什麽,都不會對操作有影響。
  • mysql數據庫的隔離級別 

  分為以下四個級別,每個級別都是來解決特點問題的

    • READ UNCOMMITTED

總結

整個AOP的分析就到此結束,接下來對事務這塊的源碼做一些分析

參考鏈接

  • https://wenku.baidu.com/view/6ce3121da300a6c30c229f89.html(核心關註點與橫切關註點)
  • https://www.cnblogs.com/syf/archive/2012/05/09/2491780.html(OOP與AOP)
  • https://blog.csdn.net/garfielder007/article/details/78057107(連接點用地概念)
  • https://docs.spring.io/spring/docs/4.3.18.RELEASE/spring-framework-reference(spring官方文檔)
  • http://www.cnblogs.com/xrq730/p/6753160.html((源碼分析的參考文章)
  • https://blog.csdn.net/elim168/article/details/78166296(@DeclareParents使用)

spring源碼之事務上篇