http://blog.csdn.net/bao19901210/article/details/41724355本地事務
1 首先什么是數據庫事物:
原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處于一致的狀態,而不會是部分完成部分失敗。在現實中的數據不應該被破壞。
隔離性(Isolation):可能有許多事務會同時處理相同的數據,因此每個事務都應該與其他事務隔離開來,防止數據損壞。
持久性(Durability):一旦事務完成,無論發生什么系統錯誤,它的結果都不應該受到影響,這樣就能從任何系統崩潰中恢復過來。通常情況下,事務的結果被寫到持久化存儲器中。
Spring事務
我們本地的TX事物:定義是兩階段提交的,為了提高操作,把事務的串行變成并行 所以出現了 事物的隔離級別,其實本質原因是讀讀,讀寫,寫讀,寫寫,操作引起的不一致,我們需要通過隔離級別來控制一致性。
事務隔離級別
隔離級別是指若干個并發的事務之間的隔離程度。TransactionDefinition 接口中定義了五個表示隔離級別的常量:
TransactionDefinition.ISOLATION_DEFAULT:這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數據。該級別不能防止臟讀,不可重復讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實際上并沒有此級別。
TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的數據。該級別可以防止臟讀,這也是大多數情況下的推薦值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重復執行某個查詢,并且每次返回的記錄都相同。該級別可以防止臟讀和不可重復讀。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。
事務為什么需要隔離級別,如果沒有隔離級別會是什么樣子的?
1.如果沒有事物我們需要跟多的回話和數據庫交互,只能串行,保證事務
2.數據庫的就是讀寫,包括讀讀,讀寫,寫讀,寫寫,如果我們資源不允許建立很多的回話,那怎么辦,就需要并行,就是可以在一個會話中可以同時,讀讀,讀寫,寫讀,寫寫,
1.1如果說;寫的時候可以在讀取時看到,那就是READ_UNCOMMITTED
1.2:如果說1.1 操作失敗了,讀取到的數據有問題,就會出現臟讀的,所以我們出現了READ_COMMITTED,保存讀取的是commit過的
1.3:每次讀取同一個事務,在多次讀取中,有可能會發生改變,類似版本的東東,給人的感覺出現錯覺了,所以出現了REPEATABLE_READ 幻讀
1.4為了避免幻讀我們出現了SERIALIZABLE就是吧并行的事務操作變成了 串行的
解決了 事務的一致性問題?
下面是多線程,其實就是事務的并發問題,就是傳播性
事務傳播行為
所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:
TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是默認值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED。
事務超時
所謂事務超時,就是指一個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。
默認設置為底層事務系統的超時值,如果底層數據庫事務系統沒有設置超時值,那么就是none,沒有超時限制。
事務只讀屬性
只讀事務用于客戶代碼只讀但不修改數據的情形,只讀事務用于特定情景下的優化,比如使用Hibernate的時候。
默認為讀寫事務。
@Transactional屬性
http://blog.csdn.net/bao19901210/article/details/41724355
事務失效http://blog.csdn.net/jiesa/article/details/53438342