每次交易都设置隔离级别

时间:2015-10-21 14:27:38

标签: spring oracle transactions isolation

当我们在@Transactional注释中设置隔离级别时,会在Connection属性上设置隔离级别,

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

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

是否需要在每个事务处理器上设置事务隔离是否为spring?

2 个答案:

答案 0 :(得分:0)

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

默认情况下,oracle的连接隔离级别设置为read committed,因此除非已将默认值设置为serializable,否则不需要指定隔离级别...如果设置了,然后没有造成任何损害,因为春天不会做任何事情。

所有这些都在AbstractPlatformTransactionManagerDataSourceTransactionManagerDataSourceUtils中,如果你想看看它的内幕:)。

答案 1 :(得分:0)

取决于您使用默认隔离级别的数据库可能不同。例如,我的本地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

现在,在每个新事务开始时hibernate都会

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED