属性级别竞争 - SQL

时间:2017-12-29 14:28:39

标签: sql

如果我有2个客户端访问相同的属性,请执行以下操作:

 c1   UPDATE ACCOUNT set balance = balance + 3000
      where NUM_ACCOUNT = 12390

 c2   UPDATE ACCOUNT set balance = balance - 1500
      where NUM_ACCOUNT = 12390

假设最初的余额 10,000欧元,最终价值是多少?

  • 10000 + 3000 - 1500 = 11500
  • 10000 + 3000 = 13000
  • 10000 - 1500 = 8500

2 个答案:

答案 0 :(得分:1)

在两次transactions提交后,它将€11.500,00 (除非发生非常讨厌的事情)。

由于您没有标记特定的DBMS,我将链接到Oracle和MS-SQL文档以及维基百科中的引用。如果你想深入了解现代relational database systems如何处理这个问题,你有很多东西可以阅读。

Atomicit

Transactions

transactions - MSDN

好消息是DBMS(任何体面的)都会让你对事物透明,而且你不需要打扰它,并且必须避免搞乱任何交易选项(阅读uncommited,快照等),除非你我非常清楚你在这里做了什么。

基本上系统将接收这两个交易并逐一提交,试图避免deadlocks和其他concurrency问题并尊重locks

答案 1 :(得分:1)

关系数据库实现了一个名为ACID properties的东西。基本上,这可以确保每个用户都能看到一致的数据视图,就像用户事务是独立运行一样。这种一致性(好的,“一致性”在技术上是四个属性中的第二个)是关系数据库用于更改数据的应用程序的关键原因。

因此,如果您的设置是针对ACID合规性设置的(它们应该是,但它们可以被覆盖),那么结果将是+1500。