1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

@Transactional(readOnly = true)は気を付けてつかう方がよさそう

Posted at

@Transactionalアノテーションの概要

Springなどでトランザクションを張って何か処理をしたい場合、@Transactionalアノテーションを使用すると思うのですが、readOnlyというオプションがあり、以下のように使います。

@Repository
open class HogeRepository {

  @Transactional(readOnly = true)
  open fun findAll(): HogeModel{
    return HogeModel()
  }
}

readOnlyなのにコミットできる場合がある

この@Transactional(readOnly = true)内で更新処理を行って例外がthrowされると基本的にはロールバックしてくれます。
ただ、IOExceptionのような検査例外はスルーされたりするようです。このため、サードパーティーのライブラリなどを使用している場合には上記のロールバックが行われない場合もあります。この場合はrollbackForをうまく指定してあげる必要があります。

トランザクションが貼られる

@Transactionalアノテーションの名前の通り、トランザクションを貼ります。なので、要件で不必要なときは非機能的な観点でつけないほうがよいです。
以下4つの場合で、MySQLでSHOW FULL PROCESSLIST\Gを用いて確認したところ、すべてでトランザクションが貼られていました。トランザクション分離レベルで制御できているなら、基本は使用しないほうがよさそうです。

@Transactional
open fun test() {
    sleep(10000L)
    hogeRepository.findAll()
}

@Transactional
open fun test() {
    hogeRepository.findAll()
    sleep(10000L)
}

@Transactional(readOnly = true)
open fun test() {
    sleep(10000L)
    hogeRepository.findAll()
}

@Transactional(readOnly = true)
open fun test() {
    hogeRepository.findAll()
    sleep(10000L)
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?