java spring事务管理系统_Java Spring-事务管理概述
2017-11-11 23:05:39
事務(wù)(Transaction):是邏輯上一組操作,要么全都成功,要么全都失敗。
一、事務(wù)的特性
原子性:事務(wù)不可分割
一致性:事務(wù)執(zhí)行的前后,數(shù)據(jù)完整性保持一致
隔離性:一個事務(wù)執(zhí)行的時候,不應(yīng)該受到其他事務(wù)的打擾
持久性:一旦結(jié)束,數(shù)據(jù)就永久的保存到數(shù)據(jù)庫
如果不考慮隔離性:
臟讀 :一個事務(wù)讀到另一個事務(wù)未提交數(shù)據(jù)
當(dāng)一個事務(wù)正在多次修改某個數(shù)據(jù),而在這個事務(wù)中這多次的修改都還未提交,這時一個并發(fā)的事務(wù)來訪問該數(shù)據(jù),就會造成兩個事務(wù)得到的數(shù)據(jù)不一致。例如:用戶A向用戶B 轉(zhuǎn)賬100元,對應(yīng)SQL命令如下:
update account set money=money+100 where name=’B’; (此時A通知B)
update account set money=money - 100 where name=’A’;
當(dāng)只執(zhí)行第一條SQL時,A通知B查看賬戶,B發(fā)現(xiàn)確實錢已到賬(此時即發(fā)生了臟讀),而之后無論第二條SQL是否執(zhí)行,只要該事務(wù)不提交,則所有操作都將回 ? ?滾,那 么當(dāng)B以后再次查看賬戶時就會發(fā)現(xiàn)錢其實并沒有轉(zhuǎn)。
不可重復(fù)讀 :一個事務(wù)讀到另一個事務(wù)已經(jīng)提交數(shù)據(jù)(update)導(dǎo)致一個事務(wù)多次查詢結(jié)果不一致
例如事務(wù)T1在讀取某一數(shù)據(jù),而事務(wù)T2立馬修改了這個數(shù)據(jù)并且提交事務(wù)給數(shù)據(jù)庫,事務(wù)T1再次讀取該數(shù)據(jù)就得到了不同的結(jié)果,發(fā)送了不可重復(fù)讀。
不可重復(fù)讀和臟讀的區(qū)別是,臟讀是某一事務(wù)讀取了另一個事務(wù)未提交的臟數(shù)據(jù),而不可重復(fù)讀則是讀取了前一事務(wù)提交的數(shù)據(jù)。
在某些情況下,不可重復(fù)讀并不是問題,比如我們多次查詢某個數(shù)據(jù)當(dāng)然以最后查詢得到的結(jié)果為主。但在另一些情況下就有可能發(fā)生問題,例如對于同一個數(shù)據(jù)A 和B依次查詢就可能不同,A和B就可能打起來了
虛讀 :一個事務(wù)讀到另一個事務(wù)已經(jīng)提交數(shù)據(jù)(insert)導(dǎo)致一個事務(wù)多次查詢結(jié)果不一致
幻讀是事務(wù)非獨立執(zhí)行時發(fā)生的一種現(xiàn)象。例如事務(wù)T1對一個表中所有的行的某個數(shù)據(jù)項做了從“1”修改為“2”的操作,這時事務(wù)T2又對這個表中插入了一行數(shù)據(jù)項,而這個數(shù)據(jù) 項的數(shù)值還是為“1”并且提交給數(shù)據(jù)庫。而操作事務(wù)T1的用戶如果再查看剛剛修改的數(shù)據(jù),會發(fā)現(xiàn)還有一行沒有修改,其實這行是從事務(wù)T2中添加的,就好像產(chǎn)生幻覺一樣,這 就是發(fā)生了幻讀。
二、MySQL數(shù)據(jù)庫提供的四種隔離級別
① Serializable (串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。
② Repeatable read (可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。
③ Read committed (讀已提交):可避免臟讀的發(fā)生。
④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。
以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當(dāng)然級別越高,執(zhí)行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時選用何種隔離級別應(yīng)該根據(jù)實際情況。在MySQL數(shù)據(jù)庫中默認的隔離級別為Repeatable read (可重復(fù)讀)。
三、Spring提供事務(wù)管理API
PlatformTransactionManager:平臺事務(wù)管理器.
commit(TransactionStatus status)
getTransaction(TransactionDefinition definition)
rollback(TransactionStatus status)
TransactionDefinition:事務(wù)定義
ISOLation_XXX:事務(wù)隔離級別.
PROPAGATION_XXX:事務(wù)的傳播行為.(不是JDBC中有的,為了解決實際開發(fā)問題.)
TIMEOUT_DEFAULT:過期時間
TransactionStatus:事務(wù)狀態(tài)
是否有保存點
是否一個新的事務(wù)
事務(wù)是否已經(jīng)提交
關(guān)系:PlatformTransactionManager通過TransactionDefinition設(shè)置事務(wù)相關(guān)信息管理事務(wù),管理事務(wù)過程中,產(chǎn)生一些事務(wù)狀態(tài):狀態(tài)由TransactionStatus記錄。
四、事務(wù)管理三個API詳解
PlatformTransactionManager:平臺事務(wù)管理器接口
Spring為不同的持久化框架提供了不同PlatformTransactionManager接口實現(xiàn),前兩種最常用:
org.springframework.jdbc.datasource.DataSourceTransactionManager : 使用Spring JDBC或iBatis 進行持久化數(shù)據(jù)時使用
org.springframework.orm.hibernate3.HibernateTransactionManager :使用Hibernate3.0版本進行持久化數(shù)據(jù)時使用
org.springframework.orm.jpa.JpaTransactionManager : 使用JPA進行持久化時使用
org.springframework.jdo.JdoTransactionManager : 當(dāng)持久化機制是Jdo時使用
org.springframework.transaction.jta.JtaTransactionManager : 使用一個JTA實現(xiàn)來管理事務(wù),在一個事務(wù)跨越多個資源時必須使用
TransactionDefinition:事務(wù)定義
* 隔離級別
ISOLATION_DEFAULT:默認級別. Mysql repeatable_read,oracle read_commited
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
* 事務(wù)的傳播行為
不是JDBC事務(wù)管理,用來解決實際開發(fā)的問題。
傳播行為:解決業(yè)務(wù)層之間的調(diào)用的事務(wù)的關(guān)系,有七種傳播行為:
PROPAGATION_REQUIRED :支持當(dāng)前事務(wù),如果不存在 就新建一個
* A,B 如果A有事務(wù),B使用A的事務(wù),如果A沒有事務(wù),B就開啟一個新的事務(wù).(A,B是在一個事務(wù)中。)
PROPAGATION_SUPPORTS :支持當(dāng)前事務(wù),如果不存在,就不使用事務(wù)
* A,B 如果A有事務(wù),B使用A的事務(wù),如果A沒有事務(wù),B就不使用事務(wù).
PROPAGATION_MANDATORY :支持當(dāng)前事務(wù),如果不存在,拋出異常
* A,B 如果A有事務(wù),B使用A的事務(wù),如果A沒有事務(wù),拋出異常.
PROPAGATION_REQUIRES_NEW :如果有事務(wù)存在,掛起當(dāng)前事務(wù),創(chuàng)建一個新的事務(wù)
* A,B 如果A有事務(wù),B將A的事務(wù)掛起,重新創(chuàng)建一個新的事務(wù).(A,B不在一個事務(wù)中.事務(wù)互不影響.)
PROPAGATION_NOT_SUPPORTED :以非事務(wù)方式運行,如果有事務(wù)存在,掛起當(dāng)前事務(wù)
* A,B 非事務(wù)的方式運行,A有事務(wù),就會掛起當(dāng)前的事務(wù).
PROPAGATION_NEVER :以非事務(wù)方式運行,如果有事務(wù)存在,拋出異常
PROPAGATION_NESTED :如果當(dāng)前事務(wù)存在,則嵌套事務(wù)執(zhí)行
* 基于 SavePoint 技術(shù).
* A,B A有事務(wù),A執(zhí)行之后,將A事務(wù)執(zhí)行之后的內(nèi)容保存到SavePoint.B事務(wù)有異常的話,用戶需要自己
設(shè)置事務(wù)提交還是回滾.
常用:
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_NESTED
總結(jié)
以上是生活随笔為你收集整理的java spring事务管理系统_Java Spring-事务管理概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: laravel mongodb如何声明数
- 下一篇: windowswps怎么以文件形式发送_