确保sql的原子性
我刚刚读到了RDBMS, RDBMS的一个特性是 原子性。因此,如果资金被提取 从帐户转到 另一个,要么是交易 到底会不会发生 完全不存在部分错误 交易。但事实上是怎样的呢 保证 针对上述场景的Sql查询 可能看起来像 (i) 更新确保sql的原子性,sql,atomicity,Sql,Atomicity,我刚刚读到了RDBMS, RDBMS的一个特性是 原子性。因此,如果资金被提取 从帐户转到 另一个,要么是交易 到底会不会发生 完全不存在部分错误 交易。但事实上是怎样的呢 保证 针对上述场景的Sql查询 可能看起来像 (i) 更新科目设置余额=余额-金额,其中ac_num=101 (ii)更新科目设置余额=余额+金额,其中acu num=102 这并不能保证原子性。。 那么它究竟是如何发生的呢 BEGIN TRANSACTION UPDATE accounts set balance = ba
科目
设置余额=余额-金额,其中ac_num=101
(ii)更新科目
设置余额=余额+金额,其中acu num=102
这并不能保证原子性。。
那么它究竟是如何发生的呢
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中更新但未提交的数据。
(这里的锁基本上只是“我在这里工作,不要碰”的注释。)要实现原子化,事务需要:
- 防止其他事务干扰它们正在写入或读取的行
- 确保在事务提交时,事务所做的所有更改或任何更改都不会出现在数据库中
第二个是这样做的,即事务将它们的操作写入一个数据库。这使得数据库即使在事务期间服务器断电时也能够恢复。在这种情况下,恢复过程将读取日志,确保活动(未限制)事务中止,并取消它们所做的更改。否,它不会锁定数据库。根据事务隔离模式,通常其他读取数据库的人在提交更新之前不会看到更新(他们会看到以前的值)。是的,这取决于事务隔离模式。在现代的RDBMS中,锁发生在行级别。这种“以前的值”会导致不可重复的读取异常。