最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解spring事務(wù)

 更新時(shí)間:2021年03月01日 17:07:43   作者:徘徊在深夜中的貓  
這篇文章主要介紹了spring事務(wù)深入理解,介紹了事物特性,事物隔離級別,事物的具體使用實(shí)例,有感興趣的同學(xué)可以研究下

事務(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è)用戶對數(shù)據(jù)進(jìn)行操作,每個(gè)用戶的操作不會與其他用戶糾纏在一起
  • Durable持久性 一旦事務(wù)完成,事務(wù)的結(jié)果應(yīng)該持久化

事務(wù)隔離級別

  • DEFAULT 使用底層數(shù)據(jù)庫預(yù)設(shè)的隔離層級
  • READ_UNCOMMITTED (讀未提交的數(shù)據(jù)) 允許事務(wù)讀取其他并行的事務(wù)還沒提交的數(shù)據(jù),臟讀、不可重復(fù)讀、幻讀問題都存在
  • READ_COMMITTED(讀已提交的數(shù)據(jù)) 只允許事務(wù)讀取其他并行事務(wù)提交的數(shù)據(jù),可以避免臟讀,但是不可重復(fù)讀和幻讀仍存在
  • REPEATABLE_READ(可重復(fù)讀) 確保事務(wù)可以多次從一個(gè)字段中讀取相同的值,在這個(gè)事務(wù)持續(xù)期間,禁止其他事務(wù)對這個(gè)字段進(jìn)行更新,可以避免臟讀和不可重復(fù)讀,但幻讀仍存在(Mysql默認(rèn)的事務(wù)隔離級別)
  • SERIALIZABLE(串行化) 確保事務(wù)可以從一個(gè)表中讀取相同的行,在這個(gè)事務(wù)持續(xù)期間,禁止其他事務(wù)對該表執(zhí)行插入、更新和刪除操作,所有并發(fā)問題都可以避免,但是性能低下

傳播行為

  • 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ù)只會進(jìn)行讀取操作,不會進(jìn)行修改操作,可以幫助數(shù)據(jù)庫引擎優(yōu)化

注:如果設(shè)置為只讀的話,千萬不要在事務(wù)里修改數(shù)據(jù),使用只讀操作時(shí),spring不會進(jìn)行加鎖處理,如果修改數(shù)據(jù)的話,會出現(xiàn)問題

事務(wù)超時(shí)

事務(wù)時(shí)間過長,則回滾

回滾規(guī)則

rollback-for 指事務(wù)對于那些檢查型異常應(yīng)當(dāng)回滾而不提交(默認(rèn)spring會對所有的運(yùn)行時(shí)異?;貪L)

no-rollback-for 指事務(wù)對于那些異常繼續(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&amp;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ù)隔離級別(isolation)、事務(wù)傳播行為(propagation)、對哪些異常執(zhí)行回滾(rollbackFor)以及不執(zhí)行回滾(noRollbackFor) 默認(rèn)對運(yùn)行時(shí)異常回滾

使用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&amp;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)起來 -->
<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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

类乌齐县| 体育| 邵武市| 乌鲁木齐县| 深州市| 信阳市| 枣强县| 湘西| 威海市| 新平| 环江| 孟津县| 五寨县| 平湖市| 宜良县| 堆龙德庆县| 天峨县| 铜梁县| 新宁县| 连平县| 沅江市| 富蕴县| 晴隆县| 涟源市| 汝南县| 桐柏县| 左权县| 黔西县| 芜湖市| 施甸县| 明光市| 汉源县| 祥云县| 舒兰市| 福建省| 兴文县| 时尚| 临潭县| 于都县| 通江县| 洪湖市|