深入理解spring事務
事務介紹
一個事務要么同時成功,要么同時失敗
特性
- Atomic原子性 事務是由一個或多個活動組成的一個工作單元。原子性確保事務中的所有操作全部發(fā)生或全部不發(fā)生
- Consistent一致性 一旦事務完成,系統(tǒng)必須確保它所建模的業(yè)務處于一致的狀態(tài)
- Isolated隔離性 事務允許多個用戶對數(shù)據(jù)進行操作,每個用戶的操作不會與其他用戶糾纏在一起
- Durable持久性 一旦事務完成,事務的結果應該持久化
事務隔離級別
- DEFAULT 使用底層數(shù)據(jù)庫預設的隔離層級
- READ_UNCOMMITTED (讀未提交的數(shù)據(jù)) 允許事務讀取其他并行的事務還沒提交的數(shù)據(jù),臟讀、不可重復讀、幻讀問題都存在
- READ_COMMITTED(讀已提交的數(shù)據(jù)) 只允許事務讀取其他并行事務提交的數(shù)據(jù),可以避免臟讀,但是不可重復讀和幻讀仍存在
- REPEATABLE_READ(可重復讀) 確保事務可以多次從一個字段中讀取相同的值,在這個事務持續(xù)期間,禁止其他事務對這個字段進行更新,可以避免臟讀和不可重復讀,但幻讀仍存在(Mysql默認的事務隔離級別)
- SERIALIZABLE(串行化) 確保事務可以從一個表中讀取相同的行,在這個事務持續(xù)期間,禁止其他事務對該表執(zhí)行插入、更新和刪除操作,所有并發(fā)問題都可以避免,但是性能低下
傳播行為
- PROPAGATION_REQUIRED 支持當前事務,如果當前沒有事務,就新建一個事務
- PROPAGATION_SUPPORTS 支持當前事務,如果當前沒有事務,就以非事務方式執(zhí)行
- PROPAGATION_MANDATORY 支持當前事務,如果當前沒有事務,就拋出異常
- PROPAGATION_REQUIRED_NEW 新建事務,如果當前存在事務,把當前事務掛起
- PROPAGATION_NOT_SUPPORTED 以非事務方式執(zhí)行操作,如果當前存在事務,就把當前事務掛起
- PROPAGATION_NEVER 以非事務方式執(zhí)行操作,如果當前存在事務,則拋出異常
- PROPAGATION_NESTED 如果當前存在事務,則在嵌套事務內執(zhí)行,如果當前沒有事務,則新建事務
只讀
事務只進行讀取操作
readOnly=true 告訴spring當前事務只會進行讀取操作,不會進行修改操作,可以幫助數(shù)據(jù)庫引擎優(yōu)化
注:如果設置為只讀的話,千萬不要在事務里修改數(shù)據(jù),使用只讀操作時,spring不會進行加鎖處理,如果修改數(shù)據(jù)的話,會出現(xiàn)問題
事務超時
事務時間過長,則回滾
回滾規(guī)則
rollback-for 指事務對于那些檢查型異常應當回滾而不提交(默認spring會對所有的運行時異?;貪L)
no-rollback-for 指事務對于那些異常繼續(xù)執(zhí)行不回滾
事務的使用
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);
<!-- 事務 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.29.RELEASE</version> </dependency> <!-- 事務管理器以及數(shù)據(jù)源 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.29.RELEASE</version> </dependency> <!-- mysql驅動 --> <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> <!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 啟用事務注解 --> <tx:annotation-driven transaction-manager="transactionManager"/>
當然由于是使用的注解,不要忘記組件掃描
<context:component-scan base-package="com.zhanghe.study.spring4.beans.tx"/>
之后就可以在要保證事務的方法上配置@Transactional以及在該注解上配置相應的事務隔離級別(isolation)、事務傳播行為(propagation)、對哪些異常執(zhí)行回滾(rollbackFor)以及不執(zhí)行回滾(noRollbackFor) 默認對運行時異?;貪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> <!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 使用xml配置事務屬性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 根據(jù)方法名指定特定的事務屬性 --> <tx:method name="get*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="save*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!-- 使用事務切入點,把事務切入點和事務屬性關聯(lián)起來 --> <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>
到此這篇關于spring事務深入理解的文章就介紹到這了,更多相關spring事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- springboot cloud使用eureka整合分布式事務組件Seata 的方法
- spring是如何實現(xiàn)聲明式事務的
- Spring事務執(zhí)行流程及如何創(chuàng)建事務
- Spring事務的開啟原理詳解
- SpringBoot2整合JTA組件實現(xiàn)多數(shù)據(jù)源事務管理
- 五分鐘教你手寫 SpringBoot 本地事務管理實現(xiàn)
- springBoot service層事務控制的操作
- spring事務隔離級別、傳播機制以及簡單配置方式
- Spring Boot事務配置詳解
- Spring實現(xiàn)聲明式事務的方法詳解
- 詳解SpringCloud-Alibaba-Seata分布式事務
- Java Spring事務使用及驗證過程詳解
- Spring SpringMVC,Spring整合MyBatis 事務配置的詳細流程
- 帶大家深入了解Spring事務
相關文章
ArrayList和JSONArray邊遍歷邊刪除到底該如何做
這篇文章主要介紹了ArrayList和JSONArray邊遍歷邊刪除到底該如何做,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Mybatis批量插入index out of range錯誤的解決(較偏的錯誤)
這篇文章主要介紹了Mybatis批量插入index out of range錯誤的解決(較偏的錯誤),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12