java 事务处理 是不是aop思想_Java面试题事务是哪个 SpringAOP对事务管理

itfish_38495_1.jpg

b5a4a6893ffd12dd5832e8ff32b9b572.pngspring概念

Spring中的spring-tx包包括了Spring对事务管理的支持。我看到即使在Spring环境下,Spring是不能完成@autowied和@Resourece注入的,不知道是哪个因素,我们应该在导入一个包spring-test。如果在Tommcat环境下Spring就能说够进行注解注入是不是Spring的注解依赖Tommcat下的那些东西以及是Jstl之类的东西呢?或是另一种可能我们执行Java代码时,Spring容器没有完成初始化所以不能注入。下面我们看一下Spring对事务的支持

事务的概念是在持久层被提起来的,事务需要遵守4个原则,即常说的 ACID

A,Automicity,原子性,强调事务成为原子级别尚未不可以再被分割,要么顺利要么成功。C,Consistency,一致性,即状态转化需要是由一种正确的状况转换到此外一种正确的状况。I,Isolation,隔离性,即相互间必须不能被妨碍。D,Durabillity,持久性,即事务提交后将被永久保存,即便发生其它故障,事务处置结果也应得到保存。

这里有一个很容易被问到的难题aop事务流程,如果我打开事务以后服务器突然断电,或者内存丢失,断电断网了这么我执行的操作时执行失败了而是没顺利呢?

492030356ba88f73c7c44861c352eb2e.png

当我们对进行增删改操作时,我们操作的对象都不属于持久化状态,如果时常出现意外,只要事务没有提交则不会对数据产生妨碍,当服务器通电了会按照自身记录的信息找到没有提交的事务之后进行回滚。那么我们在提交事务的过程中断电会怎么?这就得看服务器是否收到提交事务的请求了,如果收到了执行成功,没有则失败,这就是事务的原子性要么顺利要么成功。下面请看通过Spring实现事务管理

3c8f6b2f71c0c16b060ec259bc7dff93.pngSpring提供的事务管理器

我们将Spring提供的事务管理器读取到容器中并为其对象注入数据源,该事务管理器封装了所有对事务的操作,它依赖连接池。下面我们应该使用到Spring提供的事务模板对象,同样配置到容器中。

029aeaf3d662e7d4b79d231b8b2f67f3.png事务模板对象

事务模板对象依赖事务管理器,我们将下面的bean名字transactionManager注入到事务模板对象中。我们在service层调用dao层对象在service层完成事务操作,下图为上一篇文章终于封装好的DAO对象,该对象使用Spring原生态JDBCtemplate模板实现

43b424477028a3262ca5da135cf1b55f.png

3aad9b5be9969196276e743cd1313479.pngDAO原生对象

下面我们在service层中调用DAO对象并加入事务处理。

1bfbc171790099f1a20495553a1d3695.png服务层对事务的管控

我们应该注入Spring提供的TransactionTemplate对象,它应该的依赖已在里面的XML文件中配置完毕。我们在add方法中使用execute方法,该方式应该传入一个TransactionCallback接口种类的参数,这里使用匿名内部类实现。在内部类中重写doInTransaction方法,在doInTransaction方法内部执行我们对DAO对象中的方式就能。Spring在UserDAOImpl.insert(u)这行代码前后为我们织入了,打开Session的操作,关闭Session的操作,提交事务的操作。为了让你们有更清晰的对比,下面看一下原生MyBatis的事务处理。

1ed8fa41c0d8803a4943865d12d79671.png原生MyBatis

cdc90134a123efe20ac7bca4d76be70e.png

可以看见图中黑色框框标识出来的,资源链接开关和事务提交都由Spring为我们完成。这些事SpringAOP在事务管理中的一个应用。上面是我们service层调用DAO完成的事务操作,那么当我们出现service层调用service层中服务时,事务要怎么处理呢?这是一个事务传播行为的概念,下面假定一种情况有一个Country国家类,和一个People人数类,我们应该设置总数量就必须每个国家对应的数量也进行设置。我们应该升级国家类对象传入到People类对象中再返回一个聚合函数即升级所有的数量的字段。这个画面就应该service层的平行调用了。那么Country国家类和People人数类都有自己的事务,这时需要怎样进行管理呢?

PROPAGATION_REQUIRED:如果一个事务尚未进入,使用当前事务。如果没有事务开启,则进入自己的事务 这种事务在研发时应用比率最高也是最合理的。不过我们要按照不同的业务来灵活进行不同的事务配置,如果你不懂事务在今后工作中经常不知道如何面对,如果只使用默认事务项目可能会出现难题。PROPAGATION_SUPPORTS:如果一个事务尚未进入,使用当前事务。如果没有事务开启,自己也不会开启事务。这种事务看起来可能像开玩笑一样,但是确实是有项目会有特定需求用到此类事务。PROPAGATION_MANDATORY:如果一个事务尚未进入,使用当前事务。如果没有事务开启,则抛出异常。PROPAGATION_REQUIRES_NEW:总是开启一个新的事务。如果一个事务尚未进入,挂起当前事务自己再次进入新的事务。PROPAGATION_NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务,该参数将不会使用任何一个事务,可以用做查询语句,查询结束后再次进入之前的事务。PROPAGATION_NEVER:总是非事务地执行,如果有事务存在aop事务流程,则抛出异常。PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按第一条TransactionDefinition.PROPAGATION_REQUIRED属性执行。

Spring也有相应的事务隔离级别配置

ISOLATION_DEFAULT: 默认,这是一个PlatfromTransactionManager默认的隔离级别,使用默认的事务隔离级别。ISOLATION_READ_UNCOMMITTED:读未提交,这是事务最低的隔离级别,它允许另外一个事务可以发现这个事务未提交的数据。ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才会被此外一个事务读取。另外一个事务不能读取该事务未提交的数据。ISOLATION_REPEATALBE_READ: 可重复读这些事务隔离级别可以避免脏读,不可重复读。但是也许发生幻想读。它不仅确保一个事务不能读取另外一个事务未提交的数据外,还确保了防止后面的状况造成(不可重复读)。ISOLATION_SERIALIZABLE 串行化,这是节省最高代价之后最靠谱的事务隔离级别。事务被处置为次序执行。除了避免脏读,不重复读外,还导致了幻读。

那么Spring的事务传播行为与事务隔离级别在哪里可以修改呢?请看下图

0f9586d15c18803d361fd1b198f26a24.png

0c3422eb44825d2b98a2233a74f15b22.pngaop与事务配置

我们通过一个tx:advice标签将事务配置成一个通知,传入aop:config标签中的advisor里。tx:advice下的tx:attributes内就可以配置事务的传播行为与隔离级别了。isolation为隔离级别,propagation传播行为,read-only为能否只读。也可以借助注释来使用Spring的事务

b50ca840bfb63b37e15f8609b34f5498.png开始事务注解

在xml中添加这一标签,即可省略上图中aop的配置,然后我们在Java类中那样使用。

affb63b26a8e6bf00dda9f5816cada58.png@Transactional

@Transactional注解写在类的上面时将要对类中所有步骤生效,如果写在方法上则仅对该方式生效。方法上的注释配置会覆盖类上的@Transactional注解。在开发中建议使用注解对事务进行管控。以上就是Spring对注解对事务的支持了,有哪些疑问在下方留言即可。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-126119-1.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值