Spring 的事务介绍与理解以大白话的形式叙述!

先讲下spring的事务划分的类别这个在面试邀请的电话中经常被问:

 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

        声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

       显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。

         声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。
//上面那段copy于互联网!

第一个问题就是什么是事务:

事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列(你可以把他理解成在并发环境下的有序操作,也就是线程安全的,但是在业务中也是存在的问题就是业务数据越安全,性能就越垃圾,所以在很多时候,在性能和数据安全的情况下做下取舍),这些 操作要么都执行,要么都不执行,它是一个不可分割的工作单位(可以把它理解成链条,少了一个就不完整了是吧)。所以,事务是数据库 维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

第二个问题就是事务是什么:

① Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败(一个朋友经常讲的一句话"不是生,就是死"讲白了就是要么全部是"死",要么全部是"生",这里的生死主要指得是数据在执行删除啊修改啊这些操作的时候状态)。

② Consistency(一致性):事务完成时,数据必须处于一致状态,数据的完整性约束没有被破坏,事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样(这个我一直把他和原子性理解的差不多,唯一的不同就是,发现自己死到一半发现自己不想死,又想活过来,可以滚回来保持活着的状态)。

扫描二维码关注公众号,回复: 5219844 查看本文章

③ Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据 的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。 (也就是讲有多个同学,你们一起在干读写数据的操作,但是每个同学的事务都是独立的,不会互相影响,这个地方以后再做更加详细的讲解暂时没有想到好的例子)

④ Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。(男人是不是要持久,数据的持久化有哪些?自己想想)

下面讲讲事务的几类问题:

脏读:也就是读入了没有提交的数据。为什么会这样呢?

下面举个栗子:

看好下面的栗子图:

看到上面的图分为三列:时间,事务a取款,事务b存款。

然后结合时间的操作顺序来看这个栗子会出现上面问题:

问题出在a取款了100但是事务还没有结束也就是它可以滚回去的,但是事务b直接就把那个数据状态给查询得到了形成了“脏读”,其实就是一个事务没有结束,另外一个事务就“读”取得到数据了,然后前面那个事务又回滚就出现了脏读。

不可重复读:

事务a是不是执行了2次读取数据的状态

这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

幻读:A事务读取了B事务新增的数据,幻象读和不可重复读是两个容易混淆 的概念,前者是指读到了其它已经提交事务的新增数据,而后者是指读到了已经提交事 务的更改数据(更改或删除,你也可以理解成更改和删除引起的不可重复读就是幻读哈哈)

事务的隔离级别:

TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。

TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。

TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。

TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

猜你喜欢

转载自blog.csdn.net/weixin_41244495/article/details/85647285