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