写点什么

【Spring 持久层】Spring 事务开发,nginx 原理及应用

用户头像
极客good
关注
发布于: 刚刚

如何控制事务?(JDBC、Mybatis)


JDBC


  • Connection.setAutoCommit(false);

  • Connection.commit();

  • Connection.rollback();


Mybatis


  • Mybatis 自动开启事务

  • sqlSession.commit();,底层还是调用的 Connection

  • sqlSession.rollback();,底层还是调用的 Connection


结论:控制事务的底层,都是通过 Connection 对象完成的。


[](


)Spring 控制事务的开发


=================================================================================


  • 搭建开发环境 pom.xml


<dependency>


<groupId>org.springframework</groupId>


<artifactId>spring-tx</artifactId>


<version>5.2.6.RELEASE</version>


</dependency>


  • 编码


<bean id="userService" class="com.yusael.service.UserServiceImpl">


<property name="userDAO" ref="userDAO"/>


</bean>


<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">


<property name="dataSource" ref="dataSource"/>


</bean>


@Transactional


public class UserServiceImpl implements UserService {


private UserDAO userDAO;


<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>


  • 细节


进行动态代理底层实现的切换,默认 false 是 JDK,true 是 Cglib。


<tx:annotation-driven transaction-manager="dataSourceTransactionManager" proxy-target-class="true"/>


[](


)Spring 中的事务属性(Transaction Attribute)


=======================================================================================================


什么是事务属性


属性:描述物体特征的一系列值(性别、身高、体重)


事务属性:描述事务特征的一系列值


  1. 隔离属性

  2. 传播属性

  3. 只读属性

  4. 超时属性

  5. 异常属性


如何添加事务属性?


@Transactional(isolation=, propagation=, readOnly=,timeout=,rollbackFor,noRollbackFor=,)




[](


)隔离属性(ISOLATION)




【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码




概念:描述了事务解决并发问题的特征


  1. 什么是并发?


多个事务(用户)在同一时间,访问操作了相同的数据。


同一时间:0.000 几秒左右


  1. 并发会产生那些问题?


  • 脏读

  • 不可重复读

  • 幻影读


  1. 并发问题如何解决?


通过隔离属性解决,隔离属性中设置不同过的值,解决并发处理的过程中的问题。




事务并发产生的问题:


  • 脏读


一个事务,读取了另一个事务中没有提交的数据,会在本事务中产生数据不一样的现象


解决方案:@Transaction(isolation=Isolation.READ_COMMITTED)


  • 不可重复读


一个事务中,多次读取相同的数据,但是读取结果不一样,会在本事务中产生数据不一样的现象


注意:1.不是脏读 2.在一个事务中


解决方案:@Transaction(isolation=Isolation.REPEATABLE_READ)


本质:一把行锁(对数据库表的某一行加锁)


  • 幻影读


一个事务中,多次对整表进行查询统计,但是结果不一样,会在本事务中产生数据不一致的问题


解决方案:@Transaction(isolation=Isolation.SERIALIZABLE)


本质:表锁(对数据库某个表加锁)




安全与效率对比:


  • 并发安全:SERIALIZABLE > READ_ONLY > READ_COMMITTED

  • 运行效率:READ_COMMITTED > READ_ONLY > SERIALIZABLE




数据库对隔离属性的支持:


| 隔离属性的值 | MySQL | Oracle |


| --- | --- | --- |


| ISOLATION_READ_COMMITTED | 支持 | 支持 |


| ISOLATION_REPEATABLE_READ | 支持 | 不支持 |


| ISOLATION_SERIALIZABLE | 支持 | 支持 hi |


  • Oracle 不支持 REPEATABLE_READ,那该如何解决不可重复读?


采用 多版本比对 的方式解决不可重复读问题。




默认的隔离属性


  • Spring 会指定为 ISOLATION_DEFAULT,调用不同数据库所设置的默认隔离属性


MySQL:REPEATABLE_READ


Oracle:READ_COMMITTED


  • 查看数据库的默认隔离属性:


MySQL:SELECT @@tx_isolation;


Oracle:较麻烦,建议百度。




隔离属性在实验中的建议


  • 推荐使用 Spring 默认指定的 ISOLATION_DEFAULT

  • 未来的实战中,遇到并发访问的情况,很少见

  • 如果真的遇到并发问题,解决方案:乐观锁


Hibernate(JPA):version


MyBatis:通过拦截器自定义开发


[](


)传播属性(PROPAGATION)




概念:描述了事务解决 嵌套 问题 的特征。


事务的嵌套:指的是一个大的事务中,包含了若干个小的事务。


事务嵌套产生的问题: 大事务中融入了很多小的事务,他们彼此影响,最终就导致外部大的事务丧失了事务的原子性。


传播属性的值及其用法:


| 传播属性的值 | 外部不存在事务 | 外部存在事务 | 用法 | 备注 |


| --- | --- | --- | --- | --- |


| REQUIRED | 开启新的事务 | 融合到外部事务中 | @Transactional(propagation = Propagation.REQUIRED) | 增、删、改方法 |


| SUPPORTS | 不开启事务 | 融合到外部事务中 | @Transactional(propagation = Propagation.SUPPORTS) | 查询方法 |


| REQUIRES_NEW | 开启新的事务 | 挂起外部事务,创建新的事务 | @Transactional(propagation = Propagation.REQUIRES_NEW) | 日志记录方法中 |


| NOT_SUPPORTED | 不开启事务 | 挂起外部事务 | @Transactional(propagation = Propagation.NOT_SUPPORTED) | 极其不常用 |


| NEVER | 不开启事务 | 抛出异常 | @Transactional(propagation = Propagation.NEVER) | 极其不常用 |


| MANDATORY | 抛出异常 | 融合到外部事物中 | @Transactional(propagation = Propagation.MANDATORY) | 极其不常用 |


Spring 中传播属性的默认值是:REQUIRED


推荐传播属性的使用方式:


  • 增删改 方法:使用默认值 REQUIRED

  • 查询 方法:显示指定传播属性的值为 SUPPORTS


[](


)只读属性(readOnly)




针对于 只进行查询操作的业务方法,可以加入只读属性,提高运行效率。


默认值:false


@Transactional(readOnly = true)


[](


)超时属性(timeout)




指定了事务等待的最长时间。

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
【Spring 持久层】Spring 事务开发,nginx原理及应用