首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在每个事务上设置隔离级别

在每个事务上设置隔离级别
EN

Stack Overflow用户
提问于 2015-10-21 22:27:38
回答 2查看 1.5K关注 0票数 1

当我们在@Transactional注释中设置隔离级别时,然后在连接属性上设置隔离级别,

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-10-21 23:40:17

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

在缺省情况下,oracle的连接隔离级别被设置为读提交,因此您不需要指定隔离级别,除非您已将缺省值设置为serializable...如果你设置了它,那么就不会造成任何损害,因为弹簧什么也做不了。

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

票数 0
EN

Stack Overflow用户

发布于 2015-10-22 17:50:01

取决于您正在使用的数据库默认隔离级别可以不同。例如,我的本地mySQL和Google Cloud SQL都有可重复读取功能。要检查我使用的这些设置:

代码语言:javascript
复制
SHOW VARIABLES WHERE Variable_name ='tx_isolation'

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

不是的。为了在每个事务上将REPEATABLE-READ更改为READ COMMITTED而不接触@ transaction注释,我在persistence.xml中添加了以下内容

代码语言:javascript
复制
<property name="hibernate.connection.isolation">2</property>

哪里

代码语言:javascript
复制
1: READ UNCOMMITTED
2: READ COMMITTED
4: REPEATABLE READ
8: SERIALIZABLE

现在,在每个新事务的开始,hibernate都会这样做

代码语言:javascript
复制
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33262031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档