MySQL使用JAVA8获取并释放_LOCK()

MySQL使用JAVA8获取并释放_LOCK(),java,mysql,hibernate,hibernate-entitymanager,Java,Mysql,Hibernate,Hibernate Entitymanager,release_lock返回一个0——根据文档,这意味着锁是由另一个会话创建的 但是,在代码中,我们创建了一个会话,该会话建立锁,执行多个工作事务,然后释放锁 因此,不知何故,DB似乎正在丢失/混淆锁的所有权——或者我们的单个hibernate会话不知何故正在使用多个不同的DB连接(在java7中没有/没有这样做) 这发生在单元测试中,在它尝试释放测试步骤X的锁之后,然后尝试再次获取测试步骤X+1的锁,此时应用程序会抛出错误,因为它无法建立锁(因为它仍然由未能释放锁的前一次执行持有) 此外,这似

release_lock返回一个0——根据文档,这意味着锁是由另一个会话创建的

但是,在代码中,我们创建了一个会话,该会话建立锁,执行多个工作事务,然后释放锁

因此,不知何故,DB似乎正在丢失/混淆锁的所有权——或者我们的单个hibernate会话不知何故正在使用多个不同的DB连接(在java7中没有/没有这样做)

这发生在单元测试中,在它尝试释放测试步骤X的锁之后,然后尝试再次获取测试步骤X+1的锁,此时应用程序会抛出错误,因为它无法建立锁(因为它仍然由未能释放锁的前一次执行持有)

此外,这似乎与hibernate/c3p0连接池有某种联系。因为事实上,如果我将最大池大小减少到1(这意味着它只有一个到DB的连接),这个过程就可以正常工作


因此,当池>1时,hibernate似乎在为一个hibernate会话使用多个连接。

一个hibernate会话使用多个连接听起来不太可能。那么,您认为问题可能是@Kayaman??啊,您正在执行多个事务。那么,您很可能会使用多个连接(仍然是一次一个)。事务就是这样做的,它们定义了一个工作单元。如果有多个事务,则有多个工作单元。修复可能会改变你的设计,数据库完全按照设计工作。我现在不可能改变我的数据库设计…除了改变我的数据库设计,你还有其他解决方案吗@KayamanI没有说数据库设计,我说的是设计。但我不知道你的密码,所以我不能说太多。我建议完全摆脱
get_lock()
/
release_lock()
,如何做到这一点取决于您的代码。单个hibernate会话的多个连接听起来不太可能。那么,您认为@Kayaman可能存在什么问题?啊,您正在执行多个事务。那么,您很可能会使用多个连接(仍然是一次一个)。事务就是这样做的,它们定义了一个工作单元。如果有多个事务,则有多个工作单元。修复可能会改变你的设计,数据库完全按照设计工作。我现在不可能改变我的数据库设计…除了改变我的数据库设计,你还有其他解决方案吗@KayamanI没有说数据库设计,我说的是设计。但我不知道你的密码,所以我不能说太多。我建议完全摆脱
get\u lock()
/
release\u lock()
,如何做到这一点取决于您的代码。