Spring事务相关

        由于最近在准备面试,因此对以往所学知识做个系统的复习,本文主要针对Spring事务进行一下说明,以做备忘。

        在项目中多多少少都会涉及事务管理的问题,这算是一个项目中的基础,就初学者个人而言也算是个难点,概念比较多,不容易记忆,在实际的项目中往往再使用的时候也是一知半解,出现问题就不知道该如何解决,就个人经验,感觉要学好事务,最基本的还是要掌握最基本的事务概念,本文主要针对项目中单一数据源的本地事务的相关概念做一些记录,JTA事务以及分布式事务在本文不会涉及。

        所谓事务,用比较官方的语言讲就是指多个操作单元组成的合计,这些多个操作被看作是一个整体,要么都做,要么都不做,不允许出现某一个操作做了,而其他操作没做,举个经典的例子,银行转账操作,加入A转账给B220元,大致可以分为A账户需要扣除200元,B账户增加200元,这个转账操作就是一个整体,如果A扣除200后,银行突然断电了,那么B在无法增加200元的基础上,A的操作就需要回滚,以此保证这个转账操作的正确性。对于事务而言其必须遵循四个原则(ACID)。

        原子性,上面的转账例子就是一个很好的原子性解释,在事务中,一个事务即是一个不可分割的最小单元,事务内的操作要么全部执行,要么都不执行;

        一致性,即事务执行前后的数据均需要处于正确的状态,还是上面转账的例子,A在扣除200元后,突然断电,此时B并没有增加200,此时的数据状态就是不正确的,那么A的操作就需要回滚到扣除200元之前;

        隔离性,在并发执行的事务之间,操作相同的数据,彼此之间应该互不影响,这也是在项目实际使用中最需要考虑的地方,需要事先指定事务的隔离级别;

        持久性,事务执行成功后,所有操作后的结果应该在数据库永久保存,不会因为外部因素(断电或机器故障)造成数据丢失。

        介绍完事务的基本概念后,再来说说事务的类型都有哪些

        如果按照数据库来分,事务可以分成本地事务和分布式事务,本地事务就是单一数据源的事务,所有的事务操作都在一个数据库上进行操作,是最容易实现的事务;而分布式事务设计多个数据源,在保证本地事务的前提下,实现多个数据源本地事务的协同操作,实现比较复杂多样,本文不对此过多描述。

        在java中事务类型也可以分为JDBC事务和JTA事务,JDBC事务即是本地事务,通过connection对象控制管理;JTA事务是由JTA提供事务管理接口,自己通过编程来实现的,很多框架已经帮我们来实现,使用JTA最大的好处就是它对分布式事务的支持,即多数据源之间操作的事务支持。

        按照是否通过编程又可以将事务划分为编程式事务和声明式事务,声明式事务即通过XML配置或@Transactional注解来实现;编程式事务通过代码在具体的业务中自行实现,它能控制的事务粒度更精细灵活。

        在Spring中针对事务的隔离性做了五中级别的划分,在TransactionDefinition接口中定义的。在描述之前先说一下几个概念,脏读,一个事务读取到其他事务还未提交的数据;幻读,相同的事务(是两个不同的事务,但是事务逻辑是一样的)操作过程中,不同时间段多次读取同一个数据,读取到的内容不一致;不可重复读,统一事务中,多次读取的内容不一致;丢失更新,多个事务同时更新统一行数据,最后执行的事务会覆盖掉先前执行的事务结果,导致先前事务更新的结果丢失,主要是因为在增删改时没有上锁造成的。

    

        ISOLATION_DEFASULT:使用数据库的隔离级别

        ISOLATION_READ_UNCOMMITTED:最低级别,在事务未提交前,即可被其他事务读取,可能会造成幻读,脏读,不可重复读

        ISOLATION_READ_COMMITTED:一个事务提交后才可以被其他事务读取到,可以避免脏读,但是还是会出现幻读不可重复读的出现,大部分数据库的默认事务均采用此级别(解决方案,依据业务场景使用悲观锁或者乐观锁可以解决出现的幻读和不可重复读,但编程较为复杂)

        IOSLATION_REPEATABLE_READ:保证多次读取同一数据,每次读到的数据跟事务开始的时候是一样的,禁止读取到其他事务未提交的数据,可以避免脏读,不可重复读(修改),但还是会出现幻读(增和删)

        IOSLATION_SERIALIZABLE:最高级的事务级别,以上问题都可避免,但是对性能影响很高,单一事务均会上锁,直到此事务完成,高并发下,多个事务会排队进行,牺牲了性能。

        在Spring中除了定义事务的五大隔离级别外,还具有七种传播行为

        PROPAGATION_REQUIRED:支持当前事务,如果没有,则创建事务

        PROPAGATION_SUPPORTS:支持当前事务,如果没有,则不创建事务

        PROPAGATION_MANDATORY:支持当前事务,如果没有事务抛异常(强制业务方法不可以独立发起个人的事务,必须结合其他业务才可使用)

        PROPAGATION_REQUIRES_NEW:不管当前有没有事务,均创建事务,若当前存在事务,将当前事务挂起

        PROPAGATION_NOT_SUPPORTED:不支持当前事务,如果当前存在事务,则挂起事务,以非事务方式运行

        PROPAGATION_NREVER:不支持事务,如果当前前五存在,则抛出异常

        PROPAGATION_NESTED:如果当前事务存在,则在对事物嵌套使用,如果当前没有事务,则创建新事务,(仅使用于JDBC3.0以上版本驱动)

    至此,Spring事务相关的概念介绍完毕,对分布式事务感兴趣的可以移步此链接查看:https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值