首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务隔离级别:以不同方式设置表隔离级别

事务隔离级别:以不同方式设置表隔离级别
EN

Stack Overflow用户
提问于 2018-03-20 20:36:13
回答 1查看 119关注 0票数 1

如果我将事务隔离级别设置为READ_COMMITTED,是否可以以不同的方式设置表隔离级别,如READ_UNCOMMITTED?这样做的原因是,对表的更改需要对其他事务立即可见。

代码语言:javascript
复制
Transaction: READ_COMMITTED
Table Foo: READ_UNCOMMITTED

例如,JPA表id生成器

代码语言:javascript
复制
     Entity Type      Next Id
----------------------------------
     EMP                100
     DEPT               5

当一个事务获得员工的新Id时,将其Id提高到101。此新id必须立即对其他事务可见。否则,将导致重复的Id。

假设所有事务的隔离级别为READ_COMMITTED。如何在提交当前事务之前对其他事务可见的表进行更改?

Mysql,Oracle,SqlServer怎么样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-21 00:01:02

此新id必须立即对其他事务可见。否则,将导致重复的Id。

使用READ_UNCOMMITTED不会解决您的问题。

假设您的事务读取了最新的id值,然后尝试使用id+1。但是在读取最后一个id和尝试使用下一个值之间,第三个事务使用了该值,然后仍然会出现重复错误。

这被称为种族条件,即使您使用READ_UNCOMMITTED,也不能通过快速解决它。

此外,在任何数据库中使用READ_UNCOMMITTED都是个坏主意。如果另一个事务因某种原因而回滚怎么办?您的事务将读取永远不会“存在”的数据,因为它从未提交过。

正因为如此,所有品牌的RDBMS都有一个在事务范围之外生成id值的特性。

这些实现的共同点是数据库可以在某种全局范围内生成新的id值,从而保证两个并发事务不会生成相同的值。

您必须使用该机制生成唯一的id值,而不依赖于SELECT id+1...解决方案。SELECT受制于事务隔离,因此它无法看到最近生成的id值,无论是否已提交。但是数据库知道,它永远不会将相同的值返回给两个不同的事务。

不幸的是,这些实现的语法是不同的,因此很难编写在所有SQL数据库上工作相同的SQL代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49393666

复制
相关文章

相似问题

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