2017-05-24 18 views
0

ケース1:MyBatisのトランザクションのロールバック

class TestService{ 
    @Autowired 
    private SqlSessionTemplate sqlSession; 

    public void insert(Map map1,Map map2,Map map3){ 
      sqlSession.insert("testMapper.insert",map1); 
      sqlSession.insert("testMapper.insert",map2); 
      sqlSession.insert("testMapper.insert",map3); 
    } 
} 

をケース2:

@Service 
class ObjectService{ 
    @Autowired 
    private SqlSessionTemplate sqlSession; 

    public void insert(Map map){ 
      sqlSession.insert("testMapper.insert",map); 
    } 
} 

class TestService{ 
    @Autowired 
    private ObjectService objectService; 

    public void insert(Map map1,Map map2,Map map3){ 
      objectService.insert(map1); 
      objectService.insert(map2); 
      objectService.insert(map3); 
    } 
} 

IはMyBatisのを使用し、私はスプリングを使用してトランザクションを構成しています。ケース#1で記述されたコードが例外をスローし、トランザクションがロールバックされるという問題があります(実際にはデータベースには何も挿入されません)。

ケース#2を実行すると、エラーは再びスローされますが、データはデータベースに挿入されたままロールバックされません。

答えて

0

ほとんどの場合、トランザクション構成ではTestService.insertがトランザクションメソッドとして扱われないため、トランザクションでは実行されないため、objectService.insertの各呼び出しはそれぞれのトランザクションで実行されます。

例えば、最初の呼び出しであるobjectService.insert(map1)が正常に実行され、2番目の呼び出しで問題が発生したことを意味します。その時点で、最初のトランザクションは既にコミットされており、2番目のレコードの挿入には問題があっても、最初のトランザクションの結果はすでにデータベースに保持されています。そして、これはTestService.insertのロールバックがないように見えます。

関連する問題