Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查数据库事务中的数据?_Java_Mysql_Eclipse_Hibernate_Transactions - Fatal编程技术网

Java 如何检查数据库事务中的数据?

Java 如何检查数据库事务中的数据?,java,mysql,eclipse,hibernate,transactions,Java,Mysql,Eclipse,Hibernate,Transactions,我正在运行一个集成测试,该测试在单个事务中执行一些Hibernate代码(由Spring管理)。测试失败,出现了重复密钥冲突,我想在此之前点击一个断点并检查表内容。我不能直接进入MySQL工作台并运行SELECT查询,因为它将在事务之外。还有其他方法吗?在阅读了您的评论之后,我的印象是您主要对如何命中断点并同时能够检查数据库内容感兴趣。在正常情况下,我只会让您记录SQLs。考虑到断点,我的建议是: 将集成测试的隔离级别降低为“未限制” 降低隔离级别将允许您在调试期间查看数据库中未提交的值只要集成

我正在运行一个集成测试,该测试在单个事务中执行一些Hibernate代码(由Spring管理)。测试失败,出现了重复密钥冲突,我想在此之前点击一个断点并检查表内容。我不能直接进入MySQL工作台并运行
SELECT
查询,因为它将在事务之外。还有其他方法吗?

在阅读了您的评论之后,我的印象是您主要对如何命中断点并同时能够检查数据库内容感兴趣。在正常情况下,我只会让您记录SQLs。考虑到断点,我的建议是:

将集成测试的隔离级别降低为“未限制”

降低隔离级别将允许您在调试期间查看数据库中未提交的值只要集成测试中没有并行活动。就可以了

可以根据每个连接设置隔离级别。不需要在服务器上执行任何操作


一个侧面注意。如果您使用Hibernate,那么当您降低隔离级别时,即使并行活动也可以正常工作,因为Hibernate在事务级别1缓存中的行为与可重复读取中的行为基本相同。

可以从Eclipse的“显示”视图运行以下内容:


这将显示所有数据,尽管不是以一种非常用户友好的方式-例如,将需要计算逗号分隔字段对应的列。

您是否尝试了远程调试?当然我可以在Eclipse中调试并命中断点-但是接下来会发生什么?如果它使用重复键抛出,这意味着插入不在发生的同一事务中。您确定这个ID不存在吗?问题是,假设您有实体地址,并且您在事务中进行了一个更改,您调用Persist。该实体将被管理。如果再次进行另一个更改,则该实体仍处于管理状态。然后刷新会话,这将导致一次插入。异常不太可能是由同一事务中发生的插入引起的。不是说不可能,只是说不可能。感谢您的回答,但这确实对测试的性质做出了一些假设,在所有情况下都不可取。(例如,如果在一个模拟多个用户并发的测试中有多个并发事务怎么办?)Steve我不完全确定您在寻找什么。给我一些提示。您不想记录SQLs,但同时表示要使用调试器。很明显你脑子里有我看不见的东西。给我一些更多的提示。也许我在寻找不可能的东西,但如果能够在GUI中看到表格数据会很好,理想情况下与MySQL workbench中的显示方式类似。我现在已经接受了答案。以前存在误解,认为需要更改代码,例如在
@Transactional
属性上。但是现在已经意识到它可以通过一个简单的
设置事务隔离级别readuncommitted。您知道这在测试服务器上不起作用吗?不确定您的意思-但它在本地计算机上运行的集成测试中起作用(这是我所需要的)。
java.util.Arrays.deepToString(
  em.createNativeQuery("SELECT mystuff FROM mytable").getResultList().toArray())
  .replace("], ", "]\n");