首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在 @Transactional 块中没有调用 AbstractRoutingDataSource.determineCurrentLookupKey()?

这个问题的答案涉及到 Spring Data JPA 和 Spring Data MongoDB 的配置和实现细节,以及确定当前查找键的适当方法。

在 Spring Data JPA 中,如果使用 @Transactional 注解,则事务处理会自动使用基于当前查询的实体类型的保存点。因此,不需要调用 AbstractRoutingDataSource.determineCurrentLookupKey() 方法来获取当前查找键。如果在 @Transactional 注解中使用了多个数据源,则需要使用 AbstractRoutingDataSource.determineCurrentLookupKey() 方法来选择正确的数据源。

在 Spring Data MongoDB 中,如果使用 @Transactional 注解,则事务处理会自动使用基于当前查询的文档类型的保存点。因此,不需要调用 AbstractRoutingDataSource.determineCurrentLookupKey() 方法来获取当前查找键。如果在 @Transactional 注解中使用了多个 MongoDB 数据库,则需要使用 AbstractRoutingDataSource.determineCurrentLookupKey() 方法来选择正确的数据库。

总的来说,在 Spring Data JPA 和 Spring Data MongoDB 中,如果使用 @Transactional 注解,则不需要调用 AbstractRoutingDataSource.determineCurrentLookupKey() 方法。如果需要使用多个数据源或 MongoDB 数据库,则需要使用 AbstractRoutingDataSource.determineCurrentLookupKey() 方法来选择正确的数据源或数据库。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么wait和notify方法要在同步调用

,那么这是为什么呢?...为什么wait和notify方法要在同步调用? 我们先来发出一个灵魂拷问:什么时候才需要wait? 什么时候又需要notify?...lock.wait()堵塞,然后有元素添加到队列的时候再采用lock.notify()唤醒,这段代码可能会导致如下问题: 一个消费者调用take,发现buffer.isEmpty 消费者调用wait之前...所以:wait和notify方法要在同步调用的根本原因是,这两个方法存在竞态条件。如果不加锁的话,那么wait被调用的时候可能wait的条件已经不满足了(如上述)。...由于错误的条件下进行了wait,那么就有可能永远不会被notify到,所以我们需要强制wait/notifysynchronized

99920

java 为什么wait(),notify(),notifyAll()必须在同步方法代码调用

这一点通常不会被程序员注意,因为程序验证通常是在对象的同步方法或同步代码调用它们的。...这意味着调用某对象的wait()方法之前,当前线程必须已经获得该对象的锁。因此,线程必须在某个对象的同步方法或同步代码才能调用该对象的wait()方法。...如果没有线程该对象的等待队列中等待获得锁,那么notify()和notifyAll()将不起任何作用。调用对象的notify()和notifyAll()方法之前,调用线程必须已经得到该对象的锁。...的代码,没有对象锁是寸步难行的。....同步方法和同步,无论sleep()还是suspend()都不可能自己被调用的时候解除锁定,他们都霸占着正在使用的对象锁不放.

1.8K10
  • .NET动态调用Nodejs代码实现低代码平台代码节点

    低代码平台中,通常有业务逻辑编排的能力,在业务逻辑编排中有很多不同类型的节点,例如:逻辑判断、接口调用、数据更新等,但为了方便开发人员使用,如果添加代码的节点,将会极大增加开发效率。...代码节点可以使用 Node.js、Python 等解释型语言来处理逻辑,《dotNet 5 执行 Node.js》一文,介绍了 .NET 通过 NodeServices 包来动态执行 Node.js...1、 Rider 创建一个 .NET 8 的 Web API 项目。...CodeBlockInfo { public string Code { get; set; } } 定义一个 CodeBlockInfo 实体用来传输需要执行的 js 代码 接口 run 调用...2、 publish 目录添加 Dockerfile 文件,内容如下: FROM mcr.microsoft.com/dotnet/aspnet:8.0 COPY .

    19710

    【DB笔试面试565】Oracle为什么索引没有被使用?

    ♣ 题目部分 Oracle为什么索引没有被使用? ♣ 答案部分 “为什么索引没有被使用”是一个涉及面较广的问题。有多种原因会导致索引不能被使用。...还有很多其它原因会导致不能使用索引,这个问题在MOS(MOS即My Oracle Support)“文档1549181.1为何在查询索引未被使用”中有非常详细的解释,作者已经将相关内容发布到BLOG(...二、索引本身的问题 n 索引的索引列是否WHERE条件(Predicate List)? n 索引列是否用在连接谓词(Join Predicates)?...n 总体成本,表扫描的成本是否占大部分? n 访问空索引并不意味着比访问有值的索引高效? n 参数设置是否正确? 四、其它问题 n 是否存在远程表(Remote Table)?...n 是否WHERE子句中对索引列进行了IS NULL值判断? n 是否查询转换失败导致不能选择索引? n 是否使用了视图或子查询? ? 详细情况如下表所示: ?

    1.2K20

    为什么Java没有为空字符串设置访问API呢 | Java Debug 笔记

    为什么Java没有为空字符串设置访问API呢?...=========================熟悉Java的朋友都知道,当我们通过双引号创建字符串的时候,Java 会将字符串存储常量池中以供我们下次使用但是为什么String类不为我们提供一个对空字符串的引用呢因为这样做至少可以节省了编译的时间...我个人认为这某种意义上来说这有点“代码味道”所以说,关于String的空字符一说Java是否有更加复杂的涉及考虑还说设计者没有考虑到这个问题呢回答1===String.EMPTY是12个字符,而"..."仅仅2个字符,它们在运行时都将引用内存完全相同的实例。...我不太确定为什么是String.EMPTY可以节省编译时间,实际上我认为应该是后者考虑到String被final修饰是不可变得。

    14010

    【错误记录】Kotlin 代码运行时报错 ( init 初始化调用还未初始化的成员属性 )

    文章目录 一、报错信息 二、问题分析 三、解决方案 该问题的本质就是 , 成员属性 init 初始化代码中进行初始化 , 但是初始化之前调用了该 成员属性 , 编译时没有报错信息 , 但是运行时会报异常...init 初始化 的代码执行 次构造函数 的代码执行 首先 , 上述代码没有主构造 函数 , 因此该项忽略 ; 然后 , 执行属性的赋值 , 代码定义了 name 属性 , 但是没有进行赋值...; var name: String 再后 , 执行 init 初始化 , 其中先执行 nameFirstLetter 函数 , 该函数调用了 fun nameFirstLetter() = name...name = "Tom" } 该问题的本质就是 , 成员属性 init 初始化代码中进行初始化 , 但是初始化之前调用了该 成员属性 , 编译时没有报错信息 , 但是运行时会报异常 ;...三、解决方案 ---- 调换 初始化代码 的代码顺序 , 先给 name 成员赋值 , 然后再执行 调用 name 成员的方法 ; class Hello{ var name: String

    1.7K10

    错用synchronized和@Transactional被老板点名批量

    因为并发并不是很大,并没有一般电商项目的并发高,本身用户量也不大,还是一个单体应用,既有锁,又有事务。 当初这位网友遇到问题后,我看了他的代码,大概就猜出问题所在了。...e.printStackTrace(); } }).start(); } Thread.sleep(2000); // 抢礼品 countDownLatch.countDown(); 重现问题后,他问我为什么没有用...,为什么 @Transactional 事务不起作用?...我群里告诉他,根本原因是:@Transactional 事务时 Spring 通过 AOP 实现的,当我们调用 saveGiftTicket 方法后, saveGiftTicket 方法执行之前 Spring...而 synchronized 代码执行是事务之内执行的,当 synchronized 代码执行完后,事务还未提交,其他线程进入 synchronized 代码后,读取的数据不是最新的。

    81510

    一次 Redis 事务使用不当引发的生产事故

    那么排查的方向就是 Redis 的操作为什么会返回 null 了,以及为什么重启就又恢复正常了。 二、排查 根据上面的信息,我们先来看看 Redis 的自增操作什么情况下会返回 null。...2.3 验证推测二 如下面的表格所示,第二行没有添加 Spring 的事务注解 @Transactional时,执行 Redis 的递增命令肯定是正常的,而接下来要验证的是表格的第一行:加了 @Transactional...2.5.2 @Transactional 执行 Redis 命令 接下来标注有 @Transactional 注解的方法执行 Redis 的递增操作。...用 Postman 调用这个接口后,正常返回自增后的结果,并不是返回 null。说明非 @Transactional 执行 Redis 操作并没有受到 Redis 事务的影响。...真相大白,开启 Redis 事务支持 + @Transactional 注解后,最后其实是标记了一个 Redis 事务,后续的操作命令是在这个事务执行的。

    46940

    手把手教你Spring实现DB读写分离 | Spring系列52篇

    读写分离属于一个通用的功能,可以通过 spring 的 aop 来实现,添加一个拦截器,拦截目标方法的之前,目标方法执行之前,获取一下当前需要走哪个库,将这个标志存储 ThreadLocal ,将这个标志作为...AbstractRoutingDataSource.determineCurrentLookupKey()方法的返回值,拦截器目标方法执行完毕之后,将这个标志从 ThreadLocal 清除。...由于业务方法存在相互调用的情况,比如 service1.m1 调用 service2.m2,而 service2.m2 调用了 service2.m3,我们只需要在 m1 方法执行之前,获取具体要用哪个数据源就可以了...dataSource() { ReadWriteDataSource dataSource = new ReadWriteDataSource(); //设置主库为默认的库,当路由的时候没有...)方法去执行查询操作,第二个参数故意使用 SLAVE,如果查询有结果,说明走的是主库,否则走的是从库,这里为什么需要通过 this.userService 来调用 getUserNameById?

    75610

    Spring 事务、异步和循环依赖有什么关系?

    Spring 事务失效原因: 事务只能应用到 public 方法上才会有效;事务需要从外部调用,Spring 自调用会失效;建议事务注解 @Transactional 一般添加在实现类上。...异步的自注入 发现 @Transactional 注解可以自注入解决事务失效的问题,某次开发,自然而然想到 @Async 异步是不是也可以自注入解决循环依赖的问题。...抛出异常部分 doCreateBean 开始往上面反推 exposedObject == bean 是这一出了问题。 也就是说异步的时候,再次从二级缓存获取的和初始的不相同。...以上也就是为什么 @Async 自调用不可以,因为在后面初始化阶段被代理修改了对象。 @Transactional 为什么可以呢? ? getEarlyBeanReference ?...执行结束,发现 Bean 没有发生改变。 总结 @Transactional: 是循环依赖从二级缓存升到三级缓存的时候已经生成了代理对象。

    77310

    今日代码 PK | 处理 Spring 事务和锁冲突

    我们日常的开发,经常会接触到事务和锁, 当同时用到这二者的时候,你知道里面的坑吗? 比如,某个service里的下面这段伪代码有问题吗?...示例代码: @Transactional(rollbackFor = Exception.class) public Boolean test() { String lock = "id";..., 那么第一个事务的synchronized执行完之后且事务提交之前, 其他事务执行synchronized的代码时使用的仍然是老数据, 从这方面来说其实就相当于没有锁住,也就是锁失效。...(rollbackFor = Exception.class) public Boolean innerTest() { // 业务逻辑 return true; } 上面的代码我们没有直接调用...innerTest方法而是通过AopContext获取的对象调用, 你知道为什么吗?

    14210

    详细整理Spring事务失效的具体场景及解决方案

    容器管理的bean; 注解@Transactional所在类,注解修饰的方法被类内部方法调用; 业务代码抛出异常类型非RuntimeException,事务失效; 业务代码存在异常时,使用try…catch...…语句捕获,而catch语句没有throw new RuntimeExecption异常;(最难被排查到问题且容易忽略) 注解@TransactionalPropagation属性值设置错误即Propagation.NOT_SUPPORTED...这种失效场景是我们日常开发中最常踩坑的地方;类A里面有方法a 和方法b, 然后方法b上面用 @Transactional加了方法级别的事务,方法a里面 调用了方法b, 方法b里面的事务不会生效。...为什么会失效呢?...:其实原因很简单,Spring扫描Bean的时候会自动为标注了@Transactional注解的类生成一个代理类(proxy),当有注解的方法被调用的时候,实际上是代理类调用的,代理类调用之前会开启事务

    1.1K20

    Spring声明式事务在哪些情况下会失效?

    编程式事务 Spring事务管理的方式有两种,编程式事务和声明式事务。...try catch了 异常类型不正确,默认只支持RuntimeException和Error,不支持检查异常 事务传播配置不符合业务逻辑 @Transactional注解应用到非public方法 「为什么只有...「如果想让非public方法也生效,你可以考虑使用AspectJ」 自调用,因为@Transactional是基于动态代理实现的 当自调用时,方法执行不会经过代理对象,所以会导致事务失效。...这是因为LocationServiceImpl事务已经被标记成回滚了,所以最终事务还会回滚。...如果当前没有事务,则创建一个新的事务」 此时我们把LocationServiceImplTransactional的事务传播行为改成Propagation.REQUIRES_NEW即可 「创建一个新事务

    1.8K30

    《面试季》经典面试题(六)

    ,不符合则直接返回错误提示,符合则将数据封装成对应的实体,传递到Dao层,Dao调用对应的持久层框架API,将数据存储到数据库。...作用于接口:不推荐这种使用方法,因为一旦标注Interface上并且配置了Spring AOP 使用CGLib动态代理,将会导致@Transactional注解失效 失效场景:   1、如果Transactional...4、同一个类中方法调用,导致@Transactional失效。...因为Transactional是基于AOP实现的,它的功能实际上是生成的代理对象去实现,所以,同一个类的方法调用,实际上默认是this,即当前类调用,不是生成的代理类调用,所以无效   5、手动使用了...7、类没有被 Spring 管理,此时即使方法添加了Transactional也无法生效   8、多数据源时,数据源没有配置事务管理器也不会生效。

    40510

    事务没回滚?来,我们从现象到原理一起分析一波!

    我们先列出我们预期的结果: order_info表中有一条数据,order_info_ext表没有数据。 那么接下来,我们执行一下看看结果吧。...看到这里了,大家可以先回想一下自己项目中写的有关于事务的代码,是不是也是这样操作的: 1.通过Controller调用某个Service的方法,假如是saveMian(这个方法有没有@Transactional...如果你去问前辈,那么这个时候前辈就会告诉你: 听哥一句劝:bean不要直接调用或者使用this调用,某个被@Transactional注解标注的方法。...这样,代理类就会被设置到AopContxt。 在这里,我可以说一下之前说这个aop.xml我觉得很重要的原因。 spring时代,我们需要对xml进行各种配置。...假设当初我刚学这一知识,知识还没成体系,我硬要深入到源码,最后得到的结果也一定是在里面花费了大量时间,得到一个模棱两可的感觉,打击了自己的自信心。

    60031

    公司新来一个同事,把 @Transactional 事务注解运用得炉火纯青。。

    如果你方法中有try{}catch(Exception e){}处理,那么try里面的代码就脱离了事务的管理,若要事务生效需要在catchthrow new RuntimeException ("...Transactional注解的方法,再调用本类的其他方法method2时,那么method2方法上的@Transactional注解是不!...下面来解决一下第一点的问题,如何在方法调用本类其他方法呢。 通过AopContext.currentProxy ()获取到本类的代理对象,再去调用就好啦。...那么有人可能会有疑问了,方法1和方法2上都加@Transactional注解呢?答案是结果和上面是一致的。...小结只要方法transactionalMethod上有注解,并且方法1和方法2都处于当前事务(不使用代理调用,方法1和方法2上的@Transactional注解是不生效的;使用代理,需要方法1和方法2

    42140

    宝贝,来,讲讲spring事务有哪些坑?

    (5)spring事务控制放在service层,service方法中一个方法调用service的另一个方法,默认开启几个事务? (6)怎么保证spring事务内的连接唯一性?...) 但是实际开发,我们会遇到这么一种情况!...可能有的读者会说了 烟哥啊,其他文章里说什么数据源没有配置事务管理器也会导致事务失效,你怎么没提? OK,我为什么不提,因为这种情况属于你配置的不对!...5、spring事务控制放在service层,service方法中一个方法调用service的另一个方法,默认开启几个事务?...其实答案只有一句话,因为那个Connection事务开始时封装在了ThreadLocal里,后面事务执行过程,都是从ThreadLocal取的,肯定能保证唯一,因为都是一个线程执行的!

    62261

    spring(基础24) Spring注解@Transactional配置事务

    声明式事务有两种方式,一种是配置文件(xml)做相关的事务规则声明,另一种是基于 @Transactional 注解的方式。本文将着重介绍基于 @Transactional 注解的事务管理。...propagation = Propagation.REQUIRES_NEW),然后a方法调用b方法操作数据库,再在a方法最后抛出异常,会发现a方法的b方法对数据库的操作没有回滚,因为Propagation.REQUIRES_NEW...2.不要图省事,将@Transactional放置类级的声明,放在类声明,会使得所有方法都有事务。...比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。...而synchronized代码执行是事务之内执行的,可以推断synchronized代码执行完时,事务还未提交,其他线程进入synchronized代码后,读取的数据不是最新的。

    68820

    SpringBoot 使用 @Transactional 注解配置事务

    声明式事务有两种方式,一种是配置文件(xml)做相关的事务规则声明,另一种是基于 @Transactional 注解的方式。本文将着重介绍基于 @Transactional 注解的事务管理。...propagation = Propagation.REQUIRES_NEW),然后a方法调用b方法操作数据库,再在a方法最后抛出异常,会发现a方法的b方法对数据库的操作没有回滚,因为Propagation.REQUIRES_NEW...2.不要图省事,将@Transactional放置类级的声明,放在类声明,会使得所有方法都有事务。...比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。...而synchronized代码执行是事务之内执行的,可以推断synchronized代码执行完时,事务还未提交,其他线程进入synchronized代码后,读取的数据不是最新的。

    9.7K20
    领券