休眠|为什么交易“半承诺”

时间:2018-10-25 08:05:59

标签: java hibernate aspectj

我正在Spring Boot项目中使用Hibernate。

我有以下代码:

var geometry = new THREE.BufferGeometry();
geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
geometry.addAttribute( 'size', new THREE.BufferAttribute( sizes, 1 ) );
geometry.computeBoundingSphere();

  // Make texture
var texture = new THREE.TextureLoader().load('./disc.png')
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;

ShaderLoader('./pointshader.vert',
'./pointshader.frag',
function(vertex,fragment){
var material = new THREE.ShaderMaterial( {
uniforms: {
texture: {value : texture},
color: {value : new THREE.Color(0xffffff)}
},
vertexShader: vertex,
fragmentShader: fragment,
side: THREE.DoubleSide,
transparent: true,
alphaTest: 0.05,
// depthWrite: false
} );
this.globeDots = new THREE.(geometry, material);
this.globeDots.matrixAutoUpdate = false;
this.globeDots.lookAt(new THREE.Vector3(0, 0, 0));
props.threeObject.add(this.globeDots);
// })

现在,我在数据库中有了一个带有相关密钥的实体。因此,我希望在调用服务时,查找实体的代码确实可以找到它。但是由于public class SomeService { private Dependency dependency; @Transactional(readOnly=false) public void doSomething() { //some BL code... dependency.doSomeDbManipualation(); someOperation(); } public void someOperation() { //some code that eventually fails } } public class Dependency { public void doSomeDbManipulation() { Entity entity = ...; //get the entity from current session by its key if (entity != null) { session.delete(entity); } OtherEntity oEntity = new OtherEntity(); //set its fields Long oEntityId = session.save(oEntity); entity = new Entity(); entity.setForeignKey(oEntityId); //set other fields session.persist(entity); } } 失败,我希望数据库中不会有任何变化。

实际上,在调用someOperation()(并失败)之后,我查看了数据库,发现现有实体已删除!但是没有创建一个新实体(没关系)。

为什么该交易“半数完成”?

编辑: 显然delete()和save()会立即提交。调试时,我看到在代码中的这一行完成后立即删除了该实体。 someService.doSomething()也会立即添加到数据库中。 persist()不会立即提交。

我将AspectJ用于交易管理。这是我的pom.xml的相关部分:

OtherEntity

2 个答案:

答案 0 :(得分:0)

我不知道为什么将方面j显式添加为pom文件中的依赖项。如果使用spring boot,您将获得现成的方面。当类路径中存在重复的jar时,我看到了无法预测的行为。 >

我也无法理解为什么从本身被标记为只读事务的方法中调用数据库操作方法。

我觉得这里的设计不正确。

答案 1 :(得分:0)

我找到了解决问题的方法。 在几个类中,我有多个@ComponentScan批注。当我将它们全部删除,只剩下其中一个时,一切都按预期运行。

我不明白发生这种奇怪行为的原因,所以我对此发布了一个单独的问题,here