当我们在@Transactional注释中设置隔离级别时,然后在连接属性上设置隔离级别,
因此,当事务开始时,它必须触发SET TRANSACTION ISOLATION LEVEL READ COMMITTED查询。(这是我的假设)
那么,它会在每个事务上触发此查询吗?
是否需要在每个spring事务上都设置事务隔离?
发布于 2015-10-21 23:40:17
只有当您在注释中设置了隔离级别(明显),并且隔离级别与当前在连接上设置的级别不同时,Spring才会运行该语句来更改隔离。在事务结束时,Spring将恢复此状态并设置以前的隔离级别。此外,我认为如果您混合隔离级别,您会得到一个很好的异常,但我现在在代码中找不到它。
在缺省情况下,oracle的连接隔离级别被设置为读提交,因此您不需要指定隔离级别,除非您已将缺省值设置为serializable...如果你设置了它,那么就不会造成任何损害,因为弹簧什么也做不了。
所有这些都在AbstractPlatformTransactionManager、DataSourceTransactionManager和DataSourceUtils中,如果你想深入了解一下:)。
发布于 2015-10-22 17:50:01
取决于您正在使用的数据库默认隔离级别可以不同。例如,我的本地mySQL和Google Cloud SQL都有可重复读取功能。要检查我使用的这些设置:
SHOW VARIABLES WHERE Variable_name ='tx_isolation'是否需要在每个spring事务上设置事务隔离?
不是的。为了在每个事务上将REPEATABLE-READ更改为READ COMMITTED而不接触@ transaction注释,我在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 COMMITTEDhttps://stackoverflow.com/questions/33262031
复制相似问题