Spring AOP-事务管理

Spring AOP-事务管理,第1张

1、@Transactional使用位置

Ⅰ 写在接口类上,该接口的所有实现类的所有方法都会有事务

Ⅱ 写在接口方法上,该接口的所有实现类的该方法都会有事务;

Ⅰ 写在实现类上,该类中的所有方法都会有事务;

Ⅱ 写在实现类方法上,该方法上有事务。

建议:写在实现类或实现类的方法上。

2、PlatformTransactionManager

PlatformTransactionManager是Spring中的事务管理接口,具体如下:

3、DataSourceTransactionManager

Spring中JDBC事务管理实现类是DataSourceTransactionManager,所以我们使用MyBatis时,如果需要进行事务管理则配置该事务管理即可。

1、基础准备

jdbc.properties如下:

JdbcConfig如下:

2、测试

1、相关注解

配置类注解,定义在配置类上。

设置当前Spring环境中开启注解式事务支持。

接口、类、方法注解,定义在接口、类、方法上。

为当前业务层方法添加事务(如果设置在类或接口上方则类或接口中所有方法均添加事务)。

2、事务角色

发起事务方,在Spring中通常指代业务层开启事务的方法。

加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法。

3、@Transactional常用属性

true只读事务,false读写事务,增删改要设为false,查询设为true。

设置超时时间单位秒,在多长时间之内事务没有提交成功就自动回滚,-1表示不设置超时时间。

当出现指定异常进行事务回滚。

4、事务传播行为

比如上述测试案例中,我们给log方法上的@Transactional设置了传播属性为REQUIRES_NEW,表示当前事务协调员会自己开启一个事务。并不会因为transfer发生回滚而回滚。

Ⅰ REQUIRED(默认);

Ⅱ SUPPORTS;

Ⅲ MANDATORY;

Ⅳ REQUIRES_NEW;

Ⅴ NOT_SUPPORTED;

Ⅵ NEVER;

Ⅶ NESTED。

以上即为Spring AOP-事务管理的全部内容,感谢阅读。

这是spring的批注式事务管理

你应该去找spring的书 或 官方文档看看

这里你需要理解的是 事务的传播行为

传播行为主要是用来告知何时该开始一个新的事务 或者 何时暂停一个事务等

如:Propagation.REQUIRED 就是传播行为中的一种

表示如果它的外部已经存在一个事务;则无需再开始新的事务;(他自然在这个事务中)

如果外面没有事务则开始一个新的事务

所有这种事务声明是可以嵌套的(虽然事务声明可以嵌套,但事务本身并没有嵌套,当然事务是不可嵌套的;正像上面讲的一样)

---------------------------------------------------------------------------

如你的问题中 同时对一张表的两种 *** 作

如果这两个 *** 作封装在不同的方法中,只需将这两个方法都声明为Propagation.REQUIRED

并把更上一层调用这两个子方法的 方法也声明为Propagation.REQUIRED

这种方式比较灵活,两个方法即可独立开始事务;也可加入上层事务;具体要看业务需要

如果这两个 *** 作封装在一个方法中,只需要将这个方法都声明为Propagation.REQUIRED即可

spring

那种是可以的,一般指定用

@Transaction

指定一个service方法的事务,在service方法里面,只有出现异常(这个异常是可以指定的。),导致这个方法没有正常结束,这个就会数据库回滚。你只有把

Update

和insert写在一个方法里,然后把这个方法加上事务控制,那就可以了。这里面的实现逻辑大概是这样,首先spring获取连接,

我们在service方法里进行数据库的 *** 作,然后方法结束,

如果正常结束,spring提交事务,释放连接。如果异常结束

,spring

进行回滚,(这个回滚会把这个service方法内所有的修改 *** 作回滚。)释放连接。

大体的流程是这样。至于这些逻辑在数据库层面是如何实现的,我也不知道。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11541762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存