使用 EclipseLink 处理 Spring 事务

问题描述 投票:0回答:1

我是数据库和事务的新手。我发现了很多不同的最新信息,目前正在努力整理我的想法。 关于上下文,我正在尝试使用 SQL Server 测试当前的隔离级别,但我没有成功。

为此,我将 Spring Transaction 与 Eclipse Link 一起使用。我找到了一些关于 Spring 事务的信息(https://www.marcobehler.com/guides/spring-transaction-management-transactional-in-depth)。但是,仍然有工作单元的概念,现在我不知道当前正在使用什么(https://wiki.eclipse.org/Introduction_to_EclipseLink_Transactions_(ELUG)#Unit_of_Work_Architecture

我要测试的是: 我有一个实体用户(id、名字、姓氏)。我在表中有一个条目 id = 1, firstname = foo lastname = bar

我有一个服务和交易。恕我直言,SQL Server 的默认值为隔离 READ_COMMIT

@Transactional
public User updateUser(){
   User updateUser = new User(1, "new firstname", "new lastname");
   User updatedUser = userRepository.save(updateUser); --> em.merge
   return updatedUser;
}

到目前为止一切顺利。我现在不明白。我在返回中设置了一个断点。 同时我打开了第二个SQL客户端,执行了下面的SQL。

SET IMPLICIT_TRANSACTIONS ON 
UPDATE 
    User 
SET 
    lastname = 'complete new', 
WHERE 
    id = 1
COMMIT TRAN 

我期望的是 SQL 语句将等待 Spring 事务完成。 BUT目前不是这样的,只是简单的执行了SQL语句。

然后 lastname 在表 lastname “complete new” 中,然后我恢复断点,然后 lastname 是“new lastname”。这种行为我无法理解。这是正常的还是因为eclipse链接的单元工作?

java sql-server eclipselink spring-transactions
1个回答
-1
投票

评论(以及23Alexei Veleshko

EclipseLink缓冲需要执行的SQL语句as 尽可能长,以减少 RDBMS 中的锁定时间。在 您的特定情况 JDBC 驱动程序将收到 UPDATE 语句 当 Spring Data JPA 提交事务时。您可以通过以下方式验证 在 EclispeLink 中启用 SQL 日志记录: stackoverflow.com/q/2374395/17695211

启用SQL日志记录后你会看到不会有任何SQL 在您的断点处在控制台中调试输出。之后会出现 回报。如果你真的想看到锁定效果,你需要 在没有 Spring Data JPA 的情况下使用 @PersistenceContext 注入 EntityManager 并调用 EntityManager.flush 将刷新 SQL 语句缓冲区 EclipseLink 到断点前的 JDBC 驱动程序。

或者(如果你喜欢冒险),你可以尝试寻找一个 放置在 EclipseLink 源代码中执行 对应的PreparedStatement,紧接着设置断点 它。

© www.soinside.com 2019 - 2024. All rights reserved.