@[TOC]java
在平常的工做和開發中,接觸最多的即是與數據庫打交道,不管你使用什麼框架進行開發都繞不開事務的管理. 在Java開發中你可能會接觸不少ORM框架,不管是Hibernate、MyBatis、仍是Spring Jdbc 都會遇到事務的相關操做,再到中大型項目,你還會遇到單一數據源本地事務、多數據源本地事務、分佈式事務、分佈式多數據源事務等各類奇葩環境,數據的一致性也會面臨各類挑戰,在這時如何遊刃有餘的處理數據一致性就考驗你對事務的理解,也正是這系列文章寫做的真正緣由.sql
因爲我換工做緣由,前後在峯鳥科技、人人網、國家電網待過一段時間,前後接觸了不一樣的ORM框架數據庫
峯鳥科技
在這裏因爲SQL比較靈活,同時考慮到性能問題,這裏直接使用的Spring JDBC,爲了提升開發效率,我也開發了一個簡單ORM框架,用來將javabean 和 數據庫表信息進行關聯,提供了簡單的增刪改查和分頁功能,這時候也是我初步接觸框架的開發,接觸反射、代理等功能併發
人人網
在這裏前後使用 Python 和 Java 進行開發,用過MyBatis、Django-orm、sqlalchemy、JPA、Jade等ORM框架。其中Jade是人人網自行開發的ORM框架,使用簡單,支持條件化語句、支持多數據源切換和多數據源事務功能,相對MyBatis來講,使用方式和功能更加友好,強大。框架
國家電網
在這裏主要使用的MyBaits,第一次看見Spring事務註解能夠添加到類上而不是方法上,這也說明你懂的仍是很少分佈式
經過不一樣的經歷,也前後接觸到了JDBC事務、Spring事務、Hibernate事務、MyBaits事務、多數據源事務、分佈式事務的使用和解決方案,這裏總結一下性能
事務(Transaction):通常是指要作的或所作的事情。在計算機術語中是指訪問並可能更新數據庫中各類數據項的一個程序執行單元(unit)。atom
數據庫事務(Database Transaction):是指做爲單個邏輯工做單元執行的一系列操做,要麼徹底地執行,要麼徹底地不執行。 事務處理能夠確保除非事務性單元內的全部操做都成功完成,不然不會永久更新面向數據的資源。經過將一組相關操做組合爲一個要麼所有成功要麼所有失敗的單元,能夠簡化錯誤恢復並使應用程序更加可靠。一個邏輯工做單元要成爲事務,必須知足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。事務是數據庫運行中的邏輯工做單位,由DBMS中的事務管理子系統負責事務的處理。spa
原子性:操做這些指令時,要麼所有執行成功,要麼所有不執行。只要其中一個指令執行失敗,全部的指令都執行失敗,數據進行回滾,回到執行指令前的數據狀態。.net
一致性:事務的執行使數據從一個狀態轉換爲另外一個狀態,可是對於整個數據的完整性保持穩定。
隔離性:在該事務執行的過程當中,不管發生的任何數據的改變都應該只存在於該事務之中,對外界不存在任何影響。只有在事務肯定正確提交以後,纔會顯示該事務對數據的改變。其餘事務才能獲取到這些改變後的數據。
持久性:當事務正確完成後,它對於數據的改變是永久性的。
在許多事務處理同一個數據時,若是沒有采起有效的隔離機制,那麼併發處理數據時,會帶來一些的問題。
當一個事務讀取另外一個事務還沒有提交的修改時,產生髒讀。
同一事務內不是髒讀。 一個事務開始讀取了某行數據,可是另一個事務已經更新了此數據但沒有可以及時提交。這是至關危險的,由於極可能全部的操做都被回滾,也就是說讀取出的數據實際上是錯誤的。
一個事務對同一行數據重複讀取兩次,可是卻獲得了不一樣的結果。同一查詢在同一事務中屢次進行,因爲其餘提交事務所作的修改或刪除,每次返回不一樣的結果集,此時發生非重複讀。
事務在操做過程當中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據(這裏並不要求兩次查詢的SQL語句相同)。這是由於在兩次查詢過程當中有另一個事務插入數據形成的。
當對某行執行插入或刪除操做,而該行屬於某個事務正在讀取的行的範圍時,會發生幻像讀問題。
第一類:當兩個事務更新相同的數據源,若是第一個事務被提交,第二個卻被撤銷,那麼連同第一個事務作的更新也被撤銷。
第二類:有兩個併發事務同時讀取同一行數據,而後其中一個對它進行修改提交,而另外一個也進行了修改提交。這就會形成第一次寫操做失效。
爲了兼顧併發效率和異常控制,在標準SQL規範中,定義了4個事務隔離級別.
直譯就是"讀未提交",意思就是即便一個更新語句沒有提交,可是別的事務能夠讀到這個改變。
Read Uncommitted容許髒讀。
直譯就是"讀提交",意思就是語句提交之後,即執行了 Commit 之後別的事務就能讀到這個改變,只能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別。
Read Commited 不容許髒讀,但會出現非重複讀。
直譯就是"能夠重複讀",這是說在同一個事務裏面前後執行同一個查詢語句的時候,獲得的結果是同樣的。
Repeatable Read 不容許髒讀,不容許非重複讀,可是會出現幻象讀。
直譯就是"序列化",意思是說這個事務執行的時候不容許別的事務併發執行。徹底串行化的讀,每次讀都須要得到表級共享鎖,讀寫相互都會阻塞。
Serializable 不容許不一致現象的出現。
經過不一樣的隔離級別,能夠防止一些併發事務問題,同時級別越高則相應性能越低,這個設置須要根據實際場景進行設置.
下一篇:MySQL數據庫事務以及存儲引擎
系列文章:
事務Transaction
Spring Cloud 分佈式事務管理
Spring Cloud 分佈式事務管理(二)2pc/3pc