一脊框、什么是事務颁督?
? ? ? ? ?是數(shù)據(jù)庫操作的最小工作單元,是作為單個邏輯工作單元執(zhí)行的一系列操作浇雹;這些操作作為一個整體一起向系統(tǒng)提交沉御,要么都執(zhí)行、要么都不執(zhí)行昭灵;事務是一組不可再分割的操作集合(工作邏輯單元)吠裆;?
二、事務的四大特性
1 虎锚、原子性
? ? 事務是數(shù)據(jù)庫的邏輯工作單位硫痰,事務中包含的各操作要么都做,要么都不做
2 窜护、一致性
? ? ? ?事 務執(zhí)行的結果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)效斑。因此當數(shù)據(jù)庫只包含成功事務提交的結果時,就說數(shù)據(jù)庫處于一致性狀態(tài)柱徙。如果數(shù)據(jù)庫系統(tǒng) 運行中發(fā)生故障缓屠,有些事務尚未完成就被迫中斷奇昙,這些未完成事務對數(shù)據(jù)庫所做的修改有一部分已寫入物理數(shù)據(jù)庫,這時數(shù)據(jù)庫就處于一種不正確的狀態(tài)敌完,或者說是 不一致的狀態(tài)储耐。
3 、隔離性
? ? ? ?一個事務的執(zhí)行不能其它事務干擾滨溉。即一個事務內部的操作及使用的數(shù)據(jù)對其它并發(fā)事務是隔離的什湘,并發(fā)執(zhí)行的各個事務之間不能互相干擾。
4 晦攒、持續(xù)性
? ? ? ?也稱永久性闽撤,指一個事務一旦提交,它對數(shù)據(jù)庫中的數(shù)據(jù)的改變就應該是永久性的脯颜。接下來的其它操作或故障不應該對其執(zhí)行結果有任何影響哟旗。
三、Spring事務的配置方式
? ? ? Spring支持編程式事務管理以及聲明式事務管理兩種方式栋操。
1. 編程式事務管理
? ? ? 編程式事務管理是侵入性事務管理闸餐,使用TransactionTemplate或者直接使用PlatformTransactionManager,對于編程式事務管理矾芙,Spring推薦使用TransactionTemplate舍沙。
2. 聲明式事務管理
? ? ? 聲明式事務管理建立在AOP之上,其本質是對方法前后進行攔截蠕啄,然后在目標方法開始之前創(chuàng)建或者加入一個事務场勤,執(zhí)行完目標方法之后根據(jù)執(zhí)行的情況提交或者回滾。
? ? ? 編程式事務每次實現(xiàn)都要單獨實現(xiàn)歼跟,但業(yè)務量大功能復雜時和媳,使用編程式事務無疑是痛苦的,而聲明式事務不同哈街,聲明式事務屬于無侵入式留瞳,不會影響業(yè)務邏輯的實現(xiàn),只需要在配置文件中做相關的事務規(guī)則聲明或者通過注解的方式骚秦,便可以將事務規(guī)則應用到業(yè)務邏輯中她倘。
? ? ? 顯然聲明式事務管理要優(yōu)于編程式事務管理,這正是Spring倡導的非侵入式的編程方式作箍。唯一不足的地方就是聲明式事務管理的粒度是方法級別硬梁,而編程式事務管理是可以到代碼塊的,但是可以通過提取方法的方式完成聲明式事務管理的配置胞得。
四荧止、@Transactional介紹
@Transactional? 常作用在類和類方法上
作用于類:當把@Transactional 注解放在類上時,表示所有該類的public方法都配置相同的事務屬性信息。
作用于方法:當類配置了@Transactional跃巡,方法也配置了@Transactional危号,方法的事務會覆蓋類的事務配置信息。
五素邪、@Transactional注解屬性解析
5.1 事務的傳播機制
? ? ? ?@Transactional(propagation=Propagation.REQUIRED) :如果有事務, 那么加入事務, 沒有的話新建一個(默認)
@Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不為這個方法開啟事務
@Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事務,都創(chuàng)建一個新的事務,原來的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務
@Transactional(propagation=Propagation.MANDATORY) :必須在一個已有的事務中執(zhí)行,否則拋出異常
@Transactional(propagation=Propagation.NEVER) :必須在一個沒有的事務中執(zhí)行,否則拋出異常(與Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) :如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務.
5.2 超時設置
@Transactional(timeout=30) //設置超時30秒外莲,經(jīng)過測試和實踐,這里的超時應該是sql的超時時間兔朦。
該屬性用于設置事務的超時秒數(shù)偷线,默認值為-1表示永不超時
5.3事務隔離級別
@Transactional(isolation = Isolation.READ_UNCOMMITTED):讀取未提交數(shù)據(jù)(會出現(xiàn)臟讀, 不可重復讀) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED):讀取已提交數(shù)據(jù)(會出現(xiàn)不可重復讀和幻讀)
@Transactional(isolation = Isolation.REPEATABLE_READ):可重復讀(會出現(xiàn)幻讀)
@Transactional(isolation = Isolation.SERIALIZABLE):串行化
MYSQL: 默認為REPEATABLE_READ級別
SQLSERVER: 默認為READ_COMMITTED
1》臟讀: 一個事務讀取到另一事務未提交的更新數(shù)據(jù)
2》不可重復讀: 在同一事務中, 多次讀取同一數(shù)據(jù)返回的結果有所不同, 換句話說,
后續(xù)讀取可以讀到另一事務已提交的更新數(shù)據(jù). 相反, "可重復讀"在同一事務中多次
讀取數(shù)據(jù)時, 能夠保證所讀數(shù)據(jù)一樣, 也就是后續(xù)讀取不能讀到另一事務已提交的更新數(shù)據(jù)
3》幻讀: 一個事務讀到另一個事務已提交的insert數(shù)據(jù)
5.4 readOnly 屬性
readOnly :指定事務是否為只讀事務,默認值為 false烘绽;為了忽略那些不需要事務的方法淋昭,比如讀取數(shù)據(jù),可以設置 read-only 為 true安接。
5.5 rollbackFor 屬性
rollbackFor :用于指定能夠觸發(fā)事務回滾的異常類型,可以指定多個異常類型英融。
5.6 noRollbackFor屬性**
noRollbackFor:拋出指定的異常類型盏檐,不回滾事務,也可以指定多個異常類型驶悟。