Transactions 数据库事务冲突解决

Transactions 数据库事务冲突解决,transactions,rdbms,Transactions,Rdbms,DBMS如何解决事务中的冲突以及冲突何时发生 例如,如果我有记录 id name value 1 N1 VAL1 我的隔离级别低于快照隔离或可序列化(可重复读取或已提交读取) 第一个案例。我有两笔交易。 第一笔交易T1将name字段更新为N2 update table set name = 'N2' where id = '1' 第二个事务T2将字段值更新为VAL2。它在第一个事务之前完成 update table set value = 'VAL2' where id =

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

例如,如果我有记录

id  name  value
 1   N1    VAL1
我的隔离级别低于
快照隔离
可序列化
(可重复读取或已提交读取)

第一个案例。我有两笔交易。 第一笔交易
T1
name
字段更新为
N2

update table set name = 'N2' where id = '1'
第二个事务
T2
将字段
值更新为
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
字段的状态与开始时不同。那么会发生什么呢?事务中止并重试?或者它将中止并回滚

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

取决于RDBMS,但SQL Server使用锁定来实现它。
(这也适用于使用InnoDB而不是MyISAM的Oracle、Postgres和MySQL)

交易按照收到的顺序进行处理。
由于这一点和锁定,在两个示例中,第二个事务不可能在第一个事务之前完成

第一个例子:

第一个事务获取该行的独占锁。
第二个事务在同一行上请求独占锁,但必须等待。
第一个事务完成并释放其独占锁。
现在名称='N2',值='VAL1'
第二个事务现在获取该行的独占锁。
第二个事务完成并释放其锁。
现在名称='N2',值='VAL2'

第二个例子:

第一个事务获取该行的独占锁。
第二个事务在同一行上请求独占锁,但必须等待。
第一个事务完成并释放其独占锁。
现在名称='N2'
第二个事务现在获取该行的独占锁。
由于快照隔离,第二个事务将回滚,因为事务开始后名称的值已更改。它的锁被释放。
现在名称='N2'


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

哦,我的错。很抱歉是的,我知道在
快照隔离
可序列化
中应该是顺序的。我的意思是我没有那种孤立感。已编辑的问题。您是否考虑了特定的RDBMS?在SQL Server中,无论隔离级别如何,写入程序始终阻止写入程序(它们始终需要独占锁)。我希望其他人也这样做。如果第二个事务是读取而不是更新,那么根据它运行的隔离级别,您会看到不同的情况。我认为它们之间存在一些共同点。嗯,它们的行为应该与我描述的差不多。我指的是当我既没有
快照隔离
也没有
可序列化
时的情况。如果一个接一个地处理,则不会出现幻象读取等