首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库事务冲突解决

问数据库事务冲突解决
EN

Stack Overflow用户
提问于 2017-03-01 14:45:30
回答 1查看 2.1K关注 0票数 1

DBMS如何解决事务中的冲突以及何时发生冲突?

例如,如果我有记录

代码语言:javascript
复制
id  name  value
 1   N1    VAL1

我的隔离级别低于snapshot isolation或serializable (可重复读或读)

第一箱,,我有两个交易。第一个事务T1将name字段更新为N2

代码语言:javascript
复制
update table set name = 'N2' where id = '1'

第二个事务T2将字段value更新为VAL2。它在第一个事务之前就完成了。

代码语言:javascript
复制
update table set value = 'VAL2' where id = '1'

据我所知,这两项事务不应发生冲突,因为它们改变了记录的不同字段。我说的对吗?或者,当事务T2更改记录的状态时,就会出现冲突。

第二个案子,,我有两个交易。第一个事务T1将name字段更新为N2。

代码语言:javascript
复制
update table set name = 'N2' where id = '1'

第二个事务T2将name字段更新为N3。

代码语言:javascript
复制
update table set name = 'N3' where id = '1'

在第一次事务处理之前,它再次完成。据我所知,这应该是一个冲突,因为第一个事务的name字段的状态并不像它开始时那样。那会发生什么呢?事务中止并重试?还是会中止和回滚?

EN

回答 1

Stack Overflow用户

发布于 2017-03-01 17:03:34

您在问RDBMS如何实现ACID原则的'I‘(隔离)部分。systems)

依赖于RDBMS,但是Server使用锁定来实现它。

(这对使用MySQL的InnoDB、Postgres和MyISAM也适用)。

事务按照接收到的顺序进行处理。

因此,在这两个示例中,第二个事务不可能在第一个事务之前完成。

第一个例子:

第一个事务获取行的独占锁。

第二个事务请求同一行的独占锁,但必须等待。

第一个事务完成并释放其独占锁。

现在名称= 'N2',值= 'VAL1‘

第二个事务现在获取行上的独占锁。

第二个事务完成并释放其锁。

现在名称= 'N2',值= 'VAL2‘

第二个例子:

第一个事务获取行的独占锁。

第二个事务请求同一行的独占锁,但必须等待。

第一个事务完成并释放其独占锁。

现在名称= 'N2‘

第二个事务现在获取行上的独占锁。

由于快照隔离,自事务开始以来,随着名称的值发生更改,第二个事务将被回滚。它的锁被释放了。

现在名称= 'N2‘

此时重新运行第二个事务将导致将名称成功地更新为“N3”(假设该行上没有其他并发事务)。

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

https://stackoverflow.com/questions/42534714

复制
相关文章

相似问题

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