Spring 事务注释,隔离不适用于 READ_UNCOMMITTED
Spring Transactional annotation, isolation not working for READ_UNCOMMITTED
我在 Java 中有一个方法,它由 spring Transactional
注释包装。
我里面有2个操作,一个是delete
,一个是insert
。我的插入语句必须依赖第一个操作(即 delete
),但现在由于第一个操作尚未提交,所以我的插入失败(唯一约束)。但有趣的是,通常在同一个事务中,我应该能够 read/see 同一个事务中的未提交操作(我的旧专有框架能够做到这一点),但这在我的场景中没有发生,第二次插入仍然失败,因为它看到数据尚未删除。
我尝试使用隔离READ_UNCOMMITTED
,但它不起作用。
我必须将这两个操作放在同一个事务中,因为任何失败都应该回滚两个操作,我不能提交第一个操作然后继续第二个操作。
我如何在 Spring 框架中做到这一点?
一般在 Hibernate 中,在同一个事务中,while flushing(committing) it always follows a particular order.
Inserts
先执行,然后deletes
在刷新时执行。
所以在你的情况下是理想的,因为你在 insert
之前是 deleting
,只需在 delete
之后显式调用 enitityManager.flush()
。
或者也可以查看 EntityManager.setFlushMode()
方法,您可以在其中将刷新模式类型设置为 commit
或 auto
我在 Java 中有一个方法,它由 spring Transactional
注释包装。
我里面有2个操作,一个是delete
,一个是insert
。我的插入语句必须依赖第一个操作(即 delete
),但现在由于第一个操作尚未提交,所以我的插入失败(唯一约束)。但有趣的是,通常在同一个事务中,我应该能够 read/see 同一个事务中的未提交操作(我的旧专有框架能够做到这一点),但这在我的场景中没有发生,第二次插入仍然失败,因为它看到数据尚未删除。
我尝试使用隔离READ_UNCOMMITTED
,但它不起作用。
我必须将这两个操作放在同一个事务中,因为任何失败都应该回滚两个操作,我不能提交第一个操作然后继续第二个操作。
我如何在 Spring 框架中做到这一点?
一般在 Hibernate 中,在同一个事务中,while flushing(committing) it always follows a particular order.
Inserts
先执行,然后deletes
在刷新时执行。
所以在你的情况下是理想的,因为你在 insert
之前是 deleting
,只需在 delete
之后显式调用 enitityManager.flush()
。
或者也可以查看 EntityManager.setFlushMode()
方法,您可以在其中将刷新模式类型设置为 commit
或 auto