2016-11-30 5 views
0

私は春のブートコードに問題があります。私は@Transactionalアノテーションで分離レベルを理解しようとすると、このコードを与えられている:分離レベル再読可能スプリングブート

//BookingService class bookingService2 instance 
    @Transactional(isolation = Isolation.REPEATABLE_READ) 
    public String readConstantly() throws InterruptedException { 
     String name = ""; 
     for(int i=0; i<2; i++) { 
      name = jdbcTemplate.query("select FIRST_NAME from BOOKINGS where ID=1", (rs, rowNum) -> rs.getString("FIRST_NAME")).get(0); 
      logger.info("Read name " + name); 
      Thread.sleep(1000); 
     } 

     return name; 
    } 

このコード:

//BookingService class bookingService instance 
@Transactional 
public void updateOne(){ 
    jdbcTemplate.update("update BOOKINGS set FIRST_NAME = ? where ID = 1", "zz"); 
} 

ような実行の:

new Thread(() -> { 
      try { 
       bookingService2.readConstantly(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     }).start(); 

     bookingService.updateOne(); 

私はupdateOneを期待しますreadConstantlyトランザクションが終了するまで待つが、私がそれを呼び出すと、これが出力される:

2016-11-30 12:29:15.158 INFO 6456 --- [  Thread-3] hello.BookingService      : Read name Alice 
2016-11-30 12:29:16.158 INFO 6456 --- [  Thread-3] hello.BookingService      : Read name zz 

この場合、分離レベルではあまり効果がないのはなぜですか?

+0

あなたはどのデータベースを使用していますか? – dimitrisli

+0

入れ子のH2データベースを使用しています –

答えて

0

を見ると、H2は反復可能な読み取りをサポートしていないようです。代わりに "シリアライズ可能"を使用する必要があるかもしれません。

+0

こんにちは、それはまだ動作しません。さらに良い点は、単にSET LOCK_MODE 1を追加したことです。 SQLスキーマスクリプトでは、さらにデータソースを取得し、そこから分離レベルを設定します((org.apache.tomcat.jdbc.pool.DataSource)template.getDataSource())。setDefaultTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);それはまだ期待どおりに動作しません。プレーンjdbcではなくJDBCTemplateを使用している可能性がありますか?また、私はtxmanagerとjdbctemplateからデータソースへの参照をチェックしていて、それらは同じです –

関連する問題