zoukankan      html  css  js  c++  java
  • @Transactional(readOnly=true) in Spring

    http://www.skill-guru.com/blog/2010/12/19/transactionalreadonlytrue-in-spring/

    @Transactional(readOnly=true) in Spring

    What does this mean ?

    When a Multi Version Concurrency Control database (Oracle, Postgresql, MySQL + InnoDb) is used, a read only transaction can be translated to the non standard isolation level: READ_ONLY.

    The READ_ONLY isolation level provides the same protection as the SERIALIZED isolation level (no dirty reads, no unrepeatable reads, no phantom reads) but doesn’t allow any updates. It also doesn’t cause any lock contention because no locking is required (the database is able to revert back to previous versions of the srecords ignoring all new changes).

    Ms Sql 2005 also has a similar isolation level: SNAPSHOT.

    If you specify readOnly as true, the flush mode will be set as FlushMode.NEVER in the current Hibernate Session preventing the session from committing the transaction.

    Furthermore, setReadOnly(true) will be called on the JDBC Connection, which is also a hint to the underlying database. If your database supports it (most likely it does), this has basically the same effect as FlushMode.NEVER, but it’s stronger since you cannot even flush manually.

    Now let’s see how transaction propagation works.

    If you don’t explicitly set readOnly to true, you will have read/write transactions. Depending on the transaction attributes (like REQUIRES_NEW), sometimes your transaction is suspended at some point, a new one is started and eventually committed, and after that the first transaction is resumed.

    If a method in a read/write transaction calls a method that requires a readOnly transaction, the first one should be suspended, because otherwise a flush/commit would happen at the end of the second method.

    Conversely, if you call a method from within a readOnly transaction that requires read/write, again, the first one will be suspended, since it cannot be flushed/committed, and the second method needs that.

    In the readOnly-to-readOnly, and the read/write-to-read/write cases the outer transaction doesn’t need to be suspended (unless you specify propagation otherwise, obviously).

  • 相关阅读:
    【五种方法】mybatis使用Map返回时,当value为空时不显示key
    【日常填坑】com.zaxxer.hikari.util.DriverDataSource : Registered driver with driverClassName=com.mysql.
    NVL2(表达式1,表达式2,表达式3)表达式1带或者,与
    oracle存储过程is和begin之间的参数说明
    Idea全局搜索没有把html文件显示出来
    JAVA
    (日常踩坑)idea启动多个tomcat时,报Invalid command '' received警告
    java中impl作用
    localhost:8080要加项目名能访问的解决方法
    【ubuntu】搭建mysql5.7
  • 原文地址:https://www.cnblogs.com/silentjesse/p/5066540.html
Copyright © 2011-2022 走看看