【问题标题】:isolation level set on every transaction为每个事务设置的隔离级别
【发布时间】:2016-01-20 14:39:26
【问题描述】:

当我们在@Transactional注解中设置隔离级别,那么在Connection属性上设置隔离级别,

所以当事务开始时,它必须触发SET TRANSACTION ISOLATION LEVEL READ COMMITTED 查询。 (这是我的假设)

那么它会在每个事务上触发这个查询吗?

是否需要在spring的每个事务上设置事务隔离?

【问题讨论】:

    标签: spring oracle transactions isolation


    【解决方案1】:

    仅当您在注解中设置了隔离级别(很明显)并且隔离级别与当前在连接上设置的不同时,Spring才会运行更改隔离的语句。在事务结束时,Spring 将恢复它并设置之前的隔离级别。另外,我认为如果你混合隔离级别,你会得到一个很好的例外,但我现在在代码中找不到。

    默认情况下,oracle 的连接隔离级别设置为已提交读,因此您不需要指定隔离级别,除非您已将默认设置为可序列化...并且如果您设置了它,则不会造成任何损坏,因为spring 不会做任何事情。

    所有这些都在AbstractPlatformTransactionManagerDataSourceTransactionManagerDataSourceUtils 中,如果您想深入了解:)。

    【讨论】:

      【解决方案2】:

      取决于您使用的数据库,默认隔离级别可以不同。例如,我的本地 mySQL 和 Google Cloud SQL 具有 REPEATABLE-READ。要检查我使用的这些设置:

      SHOW VARIABLES WHERE Variable_name ='tx_isolation'
      

      是否需要在每个事务上设置事务隔离是 春天?

      没有。为了在每个事务上将 REPEATABLE-READ 更改为 READ COMMITTED 而无需触及@Tansactional 注释,我将其添加到我的 persistence.xml

      <property name="hibernate.connection.isolation">2</property>
      

      在哪里

      1: READ UNCOMMITTED
      2: READ COMMITTED
      4: REPEATABLE READ
      8: SERIALIZABLE
      

      现在,在每个新事务开始时,休眠都会进​​行

      SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
      

      【讨论】:

      • 如何检查?我的意思是sql语句的日志。
      • 将其添加到 persistence.xml jdbc:mysql://host/db?logger=com.mysql.jdbc.log.Log4JLogger&profileSQL=true 中的“javax.persistence.jdbc.url”
      • 它是 mysql 特有的还是我也可以将此记录器用于 oracle?
      • 我不知道,但解决方案可能类似
      猜你喜欢
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 2011-12-17
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      相关资源
      最近更新 更多