首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保原子性sql

确保原子性sql
EN

Stack Overflow用户
提问于 2009-03-28 10:13:11
回答 2查看 2.1K关注 0票数 7

我刚读到关于RDBMS的文章,RDBMS的一个属性是原子性。因此,如果从一个账户中提取资金并转移到另一个账户,交易要么完全发生,要么根本不发生。不存在部分事务。但实际上如何保证呢?

上述场景的accounts查询可能如下所示:(i) UPDATE set = balance - amount WHERE ac_num = 101 (ii) UPDATE accounts set balance = balance + amount WHERE ac_num = 102

这并不能保证原子性..那么它到底是如何发生的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-28 10:25:58

如果你这样做了

代码语言:javascript
复制
BEGIN TRANSACTION
UPDATE accounts set balance = balance - amount WHERE ac_num = 101
UPDATE accounts set balance = balance + amount WHERE ac_num = 102
COMMIT TRANSACTION

数据库系统将为帐户101上的更改编写备注。然后,如果帐户102上的工作将失败,则RDBMS使用这些注释来撤消101上的工作。

此外,当它在帐户101上开始工作时,它会锁定数据库,这样其他人就不能来读取帐户101中已更新但未提交的数据。(这里的锁基本上只是一个注释,“我在这里工作,不要碰”。)

票数 8
EN

Stack Overflow用户

发布于 2009-03-28 11:58:10

要实现原子性,事务需要:

  • 防止其他事务干扰它们正在写入或读取的行
  • 确保当事务提交时,该事务所做的所有更改或全部更改都将存在于数据库中。

第一个是通过事务在执行期间读取或写入的locking行来实现的。

第二个是完成的,以便事务将它们的操作写入到transaction log中。这使得数据库即使在事务期间服务器断电的情况下也能够恢复。在这种情况下,恢复过程将读取日志,确保中止活动(未提交)事务,并取消它们所做的更改。

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

https://stackoverflow.com/questions/692544

复制
相关文章

相似问题

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