Spring事务特性

什么是事务?

事务时逻辑上的一组操作,一组操作有多个逻辑,多个逻辑中失败一个则回滚,也就是要么全部成功,要么全部不成功。

事务的特性

  • 原子性(Atomicit):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么都不起作用。

  • 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一直的状态,而不会时部分完成部分失败。在现实中的数据不会被破坏。

  • 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开,防止数据破坏

  • 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中回复过来。通常情况下,事务的结果呗写道持久化储存器中。

  •  

如果不考虑隔离性会引发安全性问题

隔离界别:定义了一个书屋可能受到其他并发事务影响的成都

并发引起的问题:

  • 脏读(Dirty reads):一个事务读取到了另一个事务还没有提交的数据。

    • a事务访问并修改了数据,但是a还没有提交修改的数据,b事务访问到了这个数据,然后使用了在数据库的该数据进行操作,这个数据称之为脏数据。

  • 不可重复读(Nonrepeatable read):在同一事务中两次读取的数据不同

    • a事务访问了数据 b事务访问了a取得的数据并进行修改然后提交 a再次访问数据得到了b事务修改的数据。 a两次访问到的数据不同叫做不可重复读。

  • 幻读(Phantom read):跟不可重读读类似,同一事物读取的两次数据不一样

    • a事务查询表中所有记录 事务b插入了一条新数据然后提交 a事务再次查询所有数据,发现两次数据不一致

    • 幻读是指事务不是独立执行时发生的一种现象,a事务对表中数据进行了修改,这种修改涉及到表中全部数据行,同时,第二个事务也修改了表中数据,这种数据时向表中新增了一条数据,那么以后就会发生操作第一个书屋的用户发现表中还没有修改的数据,就像幻觉一样。

可串行化实现

解决脏读:修改数据时加上排他锁,直到事务提交才释放,读取时加共享锁,读取完后释放。(a事务读取数据时加上共享锁,这样在读取过程中其他事务就不能修改数据,共享锁保证了只能读取不能修改,如果a事务有更新操作,就会转换为排它锁,排他锁保证了不能修改也布不能读取。)

弊端:如果两个事务同时读取了事务,a事务读取完毕释放了共享锁,b事务修改了数据并进行提交,a事务再次读取,发现数据不一致,就会出现不可重复读问题。

解决不可重复读:读取数据加共享锁,写数据加排他锁,都是事务提交才释放锁。读取时不允许其他食物修改数据,不管数据在事务中读取多少次,数据都是一致的。

解决幻读:采用的范围锁RangeS RangeS_S,锁定检索范围只为只读,就解决了幻读问题。

Spring事务底层原理

划分处理单元IOC(控制反转)

将设计好的对象交给容器管理,并不是传统的在你的对象内部直接控制

IOC是专门有一个容器来创建对像,即由ioc容器来控制对象的创建以及外部资源的获取(文件)。

控制反转是指,将原本我们自己控制对象的权力交给容器来帮我们创建注入依赖对象,由容器帮我们查找及注入依赖对象,对象只需要被动的接受依赖对象,所以是反转。实现了对象之间的松耦合,方便测试,方便功能复用。

谈到IOC就不得不说到DI(Dependency Injection)

Dependency Injection:依赖注入,组件之间依赖关系由容器在运行期决定,即由容器动态地将某个依赖关系注入到组件之中,通过依赖注入机制,我们只需要通过简单的配置,无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,不需要关心具体的资源来自哪里,由谁实现。

因为程序需要IOC容器来提供对象需要的外部资源,所以程序依赖于IOC容器,由IOC容器注入应用程序的某个对象,注入了对象所需要的外部资源(包括对象,资源,数据等...)。

AOP(Aspect oriented programming )面向切面编程

解决代码重复的问题,形成横向切面效果。每个方法如同一个点,多个点构成一个面,我们将横向相同的代码提取出来形成横向切面。

 

这里的验证参数,前置日志,后置日志就可以提取出来,使得我们只需要写一次代码,实现复用的效果,那么它是怎么实现的呢。

AOP拦截需要进行事务处理的类,(比如事务实行的配置和读取,事务对象的抽象等)用TransactionProxyFactoryBean接口来使用AOP功能,生成proxy代理类对象,通过TransactionInterceptor完成对代理类方法的拦截,将事务处理的功能编制到拦截方法中,读取IOC容器事务配置属性,转化为Spring事务需要的内部结构(TransactionAttribtteSourceAdvisor),转化为TransactionAttribute表示的数据对象。

对事物处理实现(事务的生成 提交 回滚 挂起)

Spring 委托给具体的事务处理器实现。实现了一个抽象和适配。适配的具体事务处理器:DataSource 数据源支持 Hibernate 数据源事务处理支持 JDO数据员事务处理支持 JPA JTA 数据源事务处理支持。这些支持都是通过设计 PlaformTransactionManager AbstractPlatforTransaction一系列事务处理的支持。为常用数据源支持提供了一系列的 TransactionManager.

也就是 PlaformTransactionManager 实现了 TransactionInterception接口,让其与TramsactionProxyFacoryBean结合起来,形成一个Spring声明式事务处理的设计体系。

动态代理

JDK动态代理通过反射机制生成一个代理类对象,在调用前由InvokeHandler来处理

CJLIB动态代理通过asm开源包,加载class文件生成一个子类。

JDK动态代理必须实现接口。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值