深入理解spring事務(wù)
事務(wù)介紹
一個(gè)事務(wù)要么同時(shí)成功,要么同時(shí)失敗
特性
- Atomic原子性 事務(wù)是由一個(gè)或多個(gè)活動(dòng)組成的一個(gè)工作單元。原子性確保事務(wù)中的所有操作全部發(fā)生或全部不發(fā)生
- Consistent一致性 一旦事務(wù)完成,系統(tǒng)必須確保它所建模的業(yè)務(wù)處于一致的狀態(tài)
- Isolated隔離性 事務(wù)允許多個(gè)用戶對(duì)數(shù)據(jù)進(jìn)行操作,每個(gè)用戶的操作不會(huì)與其他用戶糾纏在一起
- Durable持久性 一旦事務(wù)完成,事務(wù)的結(jié)果應(yīng)該持久化
事務(wù)隔離級(jí)別
- DEFAULT 使用底層數(shù)據(jù)庫(kù)預(yù)設(shè)的隔離層級(jí)
- READ_UNCOMMITTED (讀未提交的數(shù)據(jù)) 允許事務(wù)讀取其他并行的事務(wù)還沒提交的數(shù)據(jù),臟讀、不可重復(fù)讀、幻讀問(wèn)題都存在
- READ_COMMITTED(讀已提交的數(shù)據(jù)) 只允許事務(wù)讀取其他并行事務(wù)提交的數(shù)據(jù),可以避免臟讀,但是不可重復(fù)讀和幻讀仍存在
- REPEATABLE_READ(可重復(fù)讀) 確保事務(wù)可以多次從一個(gè)字段中讀取相同的值,在這個(gè)事務(wù)持續(xù)期間,禁止其他事務(wù)對(duì)這個(gè)字段進(jìn)行更新,可以避免臟讀和不可重復(fù)讀,但幻讀仍存在(Mysql默認(rèn)的事務(wù)隔離級(jí)別)
- SERIALIZABLE(串行化) 確保事務(wù)可以從一個(gè)表中讀取相同的行,在這個(gè)事務(wù)持續(xù)期間,禁止其他事務(wù)對(duì)該表執(zhí)行插入、更新和刪除操作,所有并發(fā)問(wèn)題都可以避免,但是性能低下
傳播行為
- PROPAGATION_REQUIRED 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù)
- PROPAGATION_SUPPORTS 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行
- PROPAGATION_MANDATORY 支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常
- PROPAGATION_REQUIRED_NEW 新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起
- PROPAGATION_NOT_SUPPORTED 以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起
- PROPAGATION_NEVER 以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),則拋出異常
- PROPAGATION_NESTED 如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行,如果當(dāng)前沒有事務(wù),則新建事務(wù)
只讀
事務(wù)只進(jìn)行讀取操作
readOnly=true 告訴spring當(dāng)前事務(wù)只會(huì)進(jìn)行讀取操作,不會(huì)進(jìn)行修改操作,可以幫助數(shù)據(jù)庫(kù)引擎優(yōu)化
注:如果設(shè)置為只讀的話,千萬(wàn)不要在事務(wù)里修改數(shù)據(jù),使用只讀操作時(shí),spring不會(huì)進(jìn)行加鎖處理,如果修改數(shù)據(jù)的話,會(huì)出現(xiàn)問(wèn)題
事務(wù)超時(shí)
事務(wù)時(shí)間過(guò)長(zhǎng),則回滾
回滾規(guī)則
rollback-for 指事務(wù)對(duì)于那些檢查型異常應(yīng)當(dāng)回滾而不提交(默認(rèn)spring會(huì)對(duì)所有的運(yùn)行時(shí)異?;貪L)
no-rollback-for 指事務(wù)對(duì)于那些異常繼續(xù)執(zhí)行不回滾
事務(wù)的使用
create table user(
id int primary key AUTO_INCREMENT,
name varchar(20) not null,
account double
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user (name,account) values('張三',1000);
insert into user (name,account) values('李四',1000);
<!-- 事務(wù) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.29.RELEASE</version> </dependency> <!-- 事務(wù)管理器以及數(shù)據(jù)源 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.29.RELEASE</version> </dependency> <!-- mysql驅(qū)動(dòng) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency>
使用注解
在這里采用的是spring中的數(shù)據(jù)源
<!-- 數(shù)據(jù)源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> <!-- 事務(wù)管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 啟用事務(wù)注解 --> <tx:annotation-driven transaction-manager="transactionManager"/>
當(dāng)然由于是使用的注解,不要忘記組件掃描
<context:component-scan base-package="com.zhanghe.study.spring4.beans.tx"/>
之后就可以在要保證事務(wù)的方法上配置@Transactional以及在該注解上配置相應(yīng)的事務(wù)隔離級(jí)別(isolation)、事務(wù)傳播行為(propagation)、對(duì)哪些異常執(zhí)行回滾(rollbackFor)以及不執(zhí)行回滾(noRollbackFor) 默認(rèn)對(duì)運(yùn)行時(shí)異?;貪L
使用XML
<!-- 數(shù)據(jù)源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="123456" /> </bean> <!-- 事務(wù)管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 使用xml配置事務(wù)屬性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 根據(jù)方法名指定特定的事務(wù)屬性 --> <tx:method name="get*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="save*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 使用事務(wù)切入點(diǎn),把事務(wù)切入點(diǎn)和事務(wù)屬性關(guān)聯(lián)起來(lái) --> <aop:config> <aop:pointcut id="pointCut" expression="execution(* com.zhanghe.study.spring4.beans.tx.UserService.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/> </aop:config>
到此這篇關(guān)于spring事務(wù)深入理解的文章就介紹到這了,更多相關(guān)spring事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法
- spring是如何實(shí)現(xiàn)聲明式事務(wù)的
- Spring事務(wù)執(zhí)行流程及如何創(chuàng)建事務(wù)
- Spring事務(wù)的開啟原理詳解
- SpringBoot2整合JTA組件實(shí)現(xiàn)多數(shù)據(jù)源事務(wù)管理
- 五分鐘教你手寫 SpringBoot 本地事務(wù)管理實(shí)現(xiàn)
- springBoot service層事務(wù)控制的操作
- spring事務(wù)隔離級(jí)別、傳播機(jī)制以及簡(jiǎn)單配置方式
- Spring Boot事務(wù)配置詳解
- Spring實(shí)現(xiàn)聲明式事務(wù)的方法詳解
- 詳解SpringCloud-Alibaba-Seata分布式事務(wù)
- Java Spring事務(wù)使用及驗(yàn)證過(guò)程詳解
- Spring SpringMVC,Spring整合MyBatis 事務(wù)配置的詳細(xì)流程
- 帶大家深入了解Spring事務(wù)
相關(guān)文章
Maven?Pom?文件中的隱式依賴導(dǎo)致Jar沖突問(wèn)題
這篇文章主要介紹了Maven?Pom?文件中的隱式依賴導(dǎo)致Jar沖突問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Mybatis集成Spring的實(shí)例代碼_動(dòng)力節(jié)點(diǎn)Java 學(xué)院整理
這篇文章主要介紹了Mybatis集成Spring的實(shí)例代碼,需要的朋友可以參考下2017-09-09
關(guān)于Java使用Http輕量級(jí)請(qǐng)求庫(kù)Unirest的方法
這篇文章主要介紹了關(guān)于Java使用Http輕量級(jí)請(qǐng)求庫(kù)Unirest的方法,Unirest 是一個(gè)輕量級(jí)的 HTTP 請(qǐng)求庫(kù),可發(fā)起 GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS 請(qǐng)求,支持 Node、Ruby、Java、PHP、Python、Objective-C、.NET 等多種語(yǔ)言,需要的朋友可以參考下2023-08-08
一篇文章帶你玩轉(zhuǎn)Spring bean的終極利器
這篇文章主要給大家介紹了關(guān)于玩轉(zhuǎn)Spring bean的終極利器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring bean具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
深入分析Android系統(tǒng)中SparseArray的源碼
這篇文章主要介紹了深入分析Android系統(tǒng)中SparseArray的源碼,SparseArray為Java實(shí)現(xiàn),需要的朋友可以參考下2015-07-07
Java 單鏈表數(shù)據(jù)結(jié)構(gòu)的增刪改查教程
這篇文章主要介紹了Java 單鏈表數(shù)據(jù)結(jié)構(gòu)的增刪改查教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
關(guān)于Java如何用好線程池的方法分享(建議收藏)
這篇文章主要來(lái)和大家分享幾個(gè)關(guān)于Java如何用好線程池的建議,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-06-06
使用Java編寫一個(gè)簡(jiǎn)單的Web的監(jiān)控系統(tǒng)
這篇文章主要介紹了使用Java編寫一個(gè)簡(jiǎn)單的Web的監(jiān)控系統(tǒng)的例子,并且將重要信息轉(zhuǎn)為XML通過(guò)網(wǎng)頁(yè)前端顯示,非常之實(shí)用,需要的朋友可以參考下2015-11-11

