Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确保sql的原子性_Sql_Atomicity - Fatal编程技术网

确保sql的原子性

确保sql的原子性,sql,atomicity,Sql,Atomicity,我刚刚读到了RDBMS, RDBMS的一个特性是 原子性。因此,如果资金被提取 从帐户转到 另一个,要么是交易 到底会不会发生 完全不存在部分错误 交易。但事实上是怎样的呢 保证 针对上述场景的Sql查询 可能看起来像 (i) 更新科目设置余额=余额-金额,其中ac_num=101 (ii)更新科目设置余额=余额+金额,其中acu num=102 这并不能保证原子性。。 那么它究竟是如何发生的呢 BEGIN TRANSACTION UPDATE accounts set balance = ba

我刚刚读到了RDBMS, RDBMS的一个特性是 原子性。因此,如果资金被提取 从帐户转到 另一个,要么是交易 到底会不会发生 完全不存在部分错误 交易。但事实上是怎样的呢 保证

针对上述场景的Sql查询 可能看起来像 (i) 更新
科目
设置余额=余额-金额,其中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中,锁发生在行级别。这种“以前的值”会导致不可重复的读取异常。