http://blog.csdn.net/bao19901210/article/details/41724355本地事務
1 首先什么是數(shù)據(jù)庫事物:
原子性(Atomicity):事務是一個原子操作际乘,由一系列動作組成谱煤。事務的原子性確保動作要么全部完成视译,要么完全不起作用惠窄。
一致性(Consistency):一旦事務完成(不管成功還是失敗)室奏,系統(tǒng)必須確保它所建模的業(yè)務處于一致的狀態(tài)充坑,而不會是部分完成部分失敗拆融。在現(xiàn)實中的數(shù)據(jù)不應該被破壞。
隔離性(Isolation):可能有許多事務會同時處理相同的數(shù)據(jù)唁情,因此每個事務都應該與其他事務隔離開來疑苔,防止數(shù)據(jù)損壞。
持久性(Durability):一旦事務完成荠瘪,無論發(fā)生什么系統(tǒng)錯誤夯巷,它的結果都不應該受到影響,這樣就能從任何系統(tǒng)崩潰中恢復過來哀墓。通常情況下趁餐,事務的結果被寫到持久化存儲器中。
Spring事務
我們本地的TX事物:定義是兩階段提交的篮绰,為了提高操作后雷,把事務的串行變成并行 所以出現(xiàn)了 事物的隔離級別,其實本質(zhì)原因是讀讀吠各,讀寫臀突,寫讀,寫寫贾漏,操作引起的不一致候学,我們需要通過隔離級別來控制一致性。
事務隔離級別
隔離級別是指若干個并發(fā)的事務之間的隔離程度纵散。TransactionDefinition 接口中定義了五個表示隔離級別的常量:
TransactionDefinition.ISOLATION_DEFAULT:這是默認值梳码,表示使用底層數(shù)據(jù)庫的默認隔離級別隐圾。對大部分數(shù)據(jù)庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED掰茶。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數(shù)據(jù)暇藏。該級別不能防止臟讀,不可重復讀和幻讀濒蒋,因此很少使用該隔離級別盐碱。比如PostgreSQL實際上并沒有此級別。
TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經(jīng)提交的數(shù)據(jù)沪伙。該級別可以防止臟讀瓮顽,這也是大多數(shù)情況下的推薦值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重復執(zhí)行某個查詢焰坪,并且每次返回的記錄都相同趣倾。該級別可以防止臟讀和不可重復讀。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執(zhí)行某饰,這樣事務之間就完全不可能產(chǎn)生干擾儒恋,也就是說,該級別可以防止臟讀黔漂、不可重復讀以及幻讀诫尽。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別炬守。
事務為什么需要隔離級別牧嫉,如果沒有隔離級別會是什么樣子的?
1.如果沒有事物我們需要跟多的回話和數(shù)據(jù)庫交互减途,只能串行酣藻,保證事務
2.數(shù)據(jù)庫的就是讀寫,包括讀讀鳍置,讀寫辽剧,寫讀,寫寫税产,如果我們資源不允許建立很多的回話怕轿,那怎么辦,就需要并行辟拷,就是可以在一個會話中可以同時撞羽,讀讀,讀寫衫冻,寫讀诀紊,寫寫,
1.1如果說;寫的時候可以在讀取時看到隅俘,那就是READ_UNCOMMITTED
1.2:如果說1.1 操作失敗了邻奠,讀取到的數(shù)據(jù)有問題到推,就會出現(xiàn)臟讀的,所以我們出現(xiàn)了READ_COMMITTED惕澎,保存讀取的是commit過的
1.3:每次讀取同一個事務,在多次讀取中颜骤,有可能會發(fā)生改變唧喉,類似版本的東東,給人的感覺出現(xiàn)錯覺了忍抽,所以出現(xiàn)了REPEATABLE_READ 幻讀
1.4為了避免幻讀我們出現(xiàn)了SERIALIZABLE就是吧并行的事務操作變成了 串行的
解決了 事務的一致性問題?
下面是多線程八孝,其實就是事務的并發(fā)問題,就是傳播性
事務傳播行為
所謂事務的傳播行為是指鸠项,如果在開始當前事務之前干跛,一個事務上下文已經(jīng)存在,此時有若干選項可以指定一個事務性方法的執(zhí)行行為祟绊。在TransactionDefinition定義中包括了如下幾個表示傳播行為的常量:
TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務楼入,則加入該事務;如果當前沒有事務牧抽,則創(chuàng)建一個新的事務嘉熊。這是默認值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建一個新的事務扬舒,如果當前存在事務阐肤,則把當前事務掛起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務讲坎,則加入該事務孕惜;如果當前沒有事務,則以非事務的方式繼續(xù)運行晨炕。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行衫画,如果當前存在事務,則把當前事務掛起府瞄。
TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行碧磅,如果當前存在事務,則拋出異常遵馆。
TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務鲸郊,則加入該事務;如果當前沒有事務货邓,則拋出異常秆撮。
TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行换况;如果當前沒有事務职辨,則該取值等價于TransactionDefinition.PROPAGATION_REQUIRED盗蟆。
事務超時
所謂事務超時,就是指一個事務所允許執(zhí)行的最長時間舒裤,如果超過該時間限制但事務還沒有完成喳资,則自動回滾事務。在 TransactionDefinition 中以 int 的值來表示超時時間腾供,其單位是秒仆邓。
默認設置為底層事務系統(tǒng)的超時值,如果底層數(shù)據(jù)庫事務系統(tǒng)沒有設置超時值伴鳖,那么就是none节值,沒有超時限制。
事務只讀屬性
只讀事務用于客戶代碼只讀但不修改數(shù)據(jù)的情形榜聂,只讀事務用于特定情景下的優(yōu)化搞疗,比如使用Hibernate的時候。
默認為讀寫事務须肆。
@Transactional屬性
http://blog.csdn.net/bao19901210/article/details/41724355
事務失效http://blog.csdn.net/jiesa/article/details/53438342