深入理解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ù)還沒(méi)提交的數(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)前沒(méi)有事務(wù),就新建一個(gè)事務(wù)
- PROPAGATION_SUPPORTS 支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就以非事務(wù)方式執(zhí)行
- PROPAGATION_MANDATORY 支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(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)前沒(méi)有事務(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í)異常回滾)
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ù)的開(kāi)啟原理詳解
- SpringBoot2整合JTA組件實(shí)現(xiàn)多數(shù)據(jù)源事務(wù)管理
- 五分鐘教你手寫(xiě) 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)文章
Java項(xiàng)目打包發(fā)布到maven私倉(cāng)常見(jiàn)的幾種方式
這篇文章主要介紹了項(xiàng)目打包發(fā)布到maven私倉(cāng)常見(jiàn)的幾種方式,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03ArrayList和JSONArray邊遍歷邊刪除到底該如何做
這篇文章主要介紹了ArrayList和JSONArray邊遍歷邊刪除到底該如何做,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Java基礎(chǔ)之SpringBoot整合knife4j
Swagger現(xiàn)在已經(jīng)成了最流行的接口文檔生成與管理工具,但是你是否在用的時(shí)候也在吐槽,它是真的不好看,接口測(cè)試的json數(shù)據(jù)沒(méi)法格式化,測(cè)試地址如果更改了還要去改配置,接口測(cè)試時(shí)增加token驗(yàn)證是真的麻煩…針對(duì)Swagger的種種缺點(diǎn),Knife4j就呼之欲出了.需要的朋友可以參考下2021-05-05Mybatis批量插入index out of range錯(cuò)誤的解決(較偏的錯(cuò)誤)
這篇文章主要介紹了Mybatis批量插入index out of range錯(cuò)誤的解決(較偏的錯(cuò)誤),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12