DBMS如何解决事务中的冲突以及何时发生冲突?
例如,如果我有记录
id name value
1 N1 VAL1我的隔离级别低于snapshot isolation或serializable (可重复读或读)
第一箱,,我有两个交易。第一个事务T1将name字段更新为N2
update table set name = 'N2' where id = '1'第二个事务T2将字段value更新为VAL2。它在第一个事务之前就完成了。
update table set value = 'VAL2' where id = '1'据我所知,这两项事务不应发生冲突,因为它们改变了记录的不同字段。我说的对吗?或者,当事务T2更改记录的状态时,就会出现冲突。
第二个案子,,我有两个交易。第一个事务T1将name字段更新为N2。
update table set name = 'N2' where id = '1'第二个事务T2将name字段更新为N3。
update table set name = 'N3' where id = '1'在第一次事务处理之前,它再次完成。据我所知,这应该是一个冲突,因为第一个事务的name字段的状态并不像它开始时那样。那会发生什么呢?事务中止并重试?还是会中止和回滚?
发布于 2017-03-01 17:03:34
您在问RDBMS如何实现ACID原则的'I‘(隔离)部分。systems)
依赖于RDBMS,但是Server使用锁定来实现它。
(这对使用MySQL的InnoDB、Postgres和MyISAM也适用)。
事务按照接收到的顺序进行处理。
因此,在这两个示例中,第二个事务不可能在第一个事务之前完成。
第一个例子:
第一个事务获取行的独占锁。
第二个事务请求同一行的独占锁,但必须等待。
第一个事务完成并释放其独占锁。
现在名称= 'N2',值= 'VAL1‘
第二个事务现在获取行上的独占锁。
第二个事务完成并释放其锁。
现在名称= 'N2',值= 'VAL2‘
第二个例子:
第一个事务获取行的独占锁。
第二个事务请求同一行的独占锁,但必须等待。
第一个事务完成并释放其独占锁。
现在名称= 'N2‘
第二个事务现在获取行上的独占锁。
由于快照隔离,自事务开始以来,随着名称的值发生更改,第二个事务将被回滚。它的锁被释放了。
现在名称= 'N2‘
此时重新运行第二个事务将导致将名称成功地更新为“N3”(假设该行上没有其他并发事务)。
https://stackoverflow.com/questions/42534714
复制相似问题