Spring Transactional注释,隔离不适用于READ_UNCOMMITTED

时间:2016-05-23 04:54:07

标签: java spring java-ee spring-transactions transactional

我在Java中有一个用spring Transactional注释包装的方法。

我内部有2个操作,一个是delete,另一个是insert。我的插入语句必须依赖于第一个操作(即delete),但是由于第一个操作尚未提交,我的插入失败(唯一约束)。但有趣的是,通常在同一个事务中,我应该能够在同一个事务中读取/查看未经授权的操作(我的旧专有框架能够做到这一点),但这不适用于我的场景,第二个插入仍然失败,因为它看到数据尚未删除。

我尝试使用隔离READ_UNCOMMITTED,但它不起作用。

我必须将这两个操作放在同一个事务中,因为任何一个失败都应该回滚这两个操作,我不能提交第一个操作然后继续第二个操作。

我怎样才能在Spring框架中做到这一点?

1 个答案:

答案 0 :(得分:3)

通常在Hibernate中,在同一个事务中,while flushing(committing) it always follows a particular order.

首先执行

Inserts,然后在刷新时执行deletes

理想情况下,在您的情况下,deleting insert enitityManager.flush()只需deleteEntityManager.setFlushMode()明确调用commit

另外,还可以查看auto方法,您可以将模式类型设置为 View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet); final BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { // React to state change Log.e("onStateChanged", "onStateChanged:" + newState); if (newState == BottomSheetBehavior.STATE_EXPANDED) { //do something } else { //do something } } //Here is what you want @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { // React to dragging events Log.e("onSlide", "the offset "+ slideOffset ); } }); function array_seaech($array, $company_id, $permission) { foreach($array as $key => $value) { if($value['company'] == $company_id) { foreach($value['permission'] as $keyp => $valuep) { if($valuep == $permission) return true; } } } return false; }