当我们在@Transactional
注释中设置隔离级别时,会在Connection属性上设置隔离级别,
所以当事务开始时,它必须触发SET TRANSACTION ISOLATION LEVEL READ COMMITTED
查询。 (这是我的假设)
那么它会在每个事务上触发此查询吗?
是否需要在每个事务处理器上设置事务隔离是否为spring?
答案 0 :(得分:0)
只有在注释中设置了隔离级别(显而易见)并且隔离级别与当前在连接上设置的隔离级别不同时,Spring才会运行语句来更改隔离。在事务结束时,Spring将恢复此设置并设置先前的隔离级别。另外,如果你混合隔离级别,我认为你会得到一个很好的例外,但我现在在代码中找不到它。
默认情况下,oracle的连接隔离级别设置为read committed,因此除非已将默认值设置为serializable,否则不需要指定隔离级别...如果设置了,然后没有造成任何损害,因为春天不会做任何事情。
所有这些都在AbstractPlatformTransactionManager
,DataSourceTransactionManager
和DataSourceUtils
中,如果你想看看它的内幕:)。
答案 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