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方法内所有的修改 *** 作回滚。)释放连接。
大体的流程是这样。至于这些逻辑在数据库层面是如何实现的,我也不知道。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)