spring与事务

Spring(Spring Framework) 是一个开源框架,致力于全方位的简化Java开发,降低程序的耦合度

  IOC:控制反转, 将 new 的过程交给spring容器去处理。IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式之一是DI。(@Component组件注解,用于修饰一个类,普通属性使用 @Value,对象属性使用 @Autowired)

  DI:依赖注入是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是由外部容器创建后传递给程序。依赖注入是目前最优秀的解耦方式。

  AOP: 即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。动态代理,在代码执行过程中,动态嵌入其他代码,常见的使用场景:

         i :日志
         ii: 事务
         iii:数据库操作

        动态代理:在业务中使用动态代理(JDK、CGLIB),一般是为了给需要实现的方法添加预处理或者添加后续操作,但是不干预实现类的正常业务,把一些基本业务和主要的业务逻辑分离。如加事务,加权限,加日志。

               JDK 动态代理只能对实现了接口的类产生代理,代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性。

                       JDK通过proxy类newProxyInstance方法创建代理对象,其参数 ClassLoader(类加载器,加载被代理对象字节码),class[](字节码数组,让代理对象和被代理对象拥有相同的方法),InvocationHandler(用于提供增强的方法)

               Cglib 动态代理可以对没有实现接口的类产生代理对象,对指定的类生成一个子类,所以该类(被代理的类)或方法不能声明final

                       通过Enhancer类中的create方法创建代理对象,其参数 class(被指定代理对象的字节码) , InvocationHandler(用于提供增强的方法)

spring中事务失效场景,其中一种,在同一个类中相互调用,由于spring是通过AOP 代理对象管理事务,同类中方法调用是this.XXX,故失效;

不考虑事物隔离性导致的问题:

  • 读问题:

1)脏读:B事务读取到了A事务尚未提交的数据 ------ 要求B事务要读取A事 务提交的数据

2)不可重复读:一个事务中 两次读取的数据的内容不一致 ----- 要求的是一个事 务中多次读取时数据是一致的 — unpdate

3)幻读/虚读:一个事务中 两次读取的数据的数量不一致 ----- 要求在一个事务多 次读取的数据的数量是一致的 — insert delete

  • 写问题: 丢失更新

具有四个特性(事务要么全部成功,要么全部失败,事务就是用户定义的一系列数据库操作,并视为一个完整逻辑的处理单元):

  • 原子性:事务不可分

  • 一致性:事务执行前后数据完整性保持一致

  • 隔离性:一个事务的执行不应该受到其他事务干扰

  • 持久性:一旦事务结束,数据就持久化到数据库

解决读问题:设置事务隔离级别

  • Read uncommitted: 未提交读,无法解决任何读问题

  • Read committed: 已提交读,解决脏读问题 —— oracle默认的

  • Repeatable read: 重复读,解决脏读和不可重复读问题 —— mysql默认的

  • Serializable:序列化,解决所有读问题。但会大大影响系统的性能,一般不用。

spring中7种事务传播机制:(a执行过程中调用b,b是被调用者)

 required:(spring默认传播类型): 如果当前 a 没有事务则自己 b 创建事务,如果当前存在事务则加入事务 (一起成功一起失败)

 supports: 当前a存在事务则加入事务 ,则加入b事务;当前a没有事务,则以非事务方法执行(以调用方为主)

 mandatory:当前a存在事务则加入事务;当前a不存在事务则抛出异常(调用方不存在事务则抛出异常)

 requires_new:挂起当前事务,各执行各的,异常后各自回滚各自的(各自处理各自事务)

 not_supported:被调用者b必须以非事务运行,如果当前a存在事务,则自己执行(被调用方必须以非事务方式运行)

 never:不使用事务,如果当前a存在事务则抛出异常(不能存在事务,调用方存在事务则抛出异常)

 nested:如果当前a事务存在,则自己b嵌套其中执行;当a回滚时,b跟着回滚;当b回滚时,a不一定回滚(a作为父事务可能会吃掉b的异常)

spring-mybatis.xml:

1、自动扫描路径                  <context:component-scan>

2、引入数据库配置文件       <context:property-placeholder>

3、配置数据源连接池           <bean id="dataSource"  class="com.alibaba.druid.pool.DruidDataSource">

4、集成mybatis                    <bean id="sqlSessionFacotry" class="org.mybatis.spring.SqlSessionFactoryBean">

5、 配置包扫描创建映射接口代理对象 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

6、配置事务管理器              <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值