事务处理:如何管理同时事务?

Pan*_*yay 3 parallel-processing database-design database-connection transactions

假设账户ABC(资金:1000)发生一笔6000的取款交易,同时从ATM取款8000。那么交易将如何管理。数据库是否会只打开一个连接并且不允许与同一帐户建立新连接?.... 当需要在同一账户上同时进行交易时会发生什么以及如何管理这些事情。

Pis*_*3.0 6

这是一个关于非常复杂主题的好问题。数据库中有一个技术术语,事务,它保证两个冲突的操作不能同时发生;这是通过实施 ACID 原则(原子性、一致性、隔离性、持久性)来实现的。ACID 是关系数据库(如 Oracle、Postgres、MySQL 和 MSSQL)的核心。非常简短:

  • 原子性意味着整个交易要么发生,要么什么都不发生:要么从一个地方提取资金,存入另一个地方,并且记录整个事情(并且交易成功完成),要么交易被中止(回滚) ,就像什么都没发生一样;这保证了您不能只进行提款而不进行存款。

  • 一致性意味着您始终处于无错误状态:交易要么完成,要么根本不发生,因此不存在不完整或拙劣的交易(例如,您不能同时进行两次余额更新) ,因为你可能会得到不一致的状态)

  • 隔离意味着发生的任何请求都可以假设没有其他任何东西正在接触数据 - 例如,在您的情况下,ATM 不必关心还有谁试图访问该帐户。这可能意味着执行速度较慢(“哎呀,现在无法访问此行,请稍候”),但显着简化了应用程序算法。

  • 持久性意味着即使系统崩溃,这一点仍然有效——即使断电,也始终保持一致的状态。

例如,请参阅此以供进一步阅读:http://www.agiledata.org/essays/transactionControl.html

因此,在实践中,“同时”不会发生:一个请求将排在第一个,另一个请求将排在第二(因为包含余额的行被第一个请求锁定,第二个进程必须等待,直到它变得可用) )。由于隔离,无需担心“同时”:要么现在有足够的钱可以提取,要么没有;另一个提款排队并在 50 毫秒内尝试(当第一个请求完成时,数据库会删除相关行上的锁定,并且队列中的下一个请求将发生),这根本不重要。以当前计算机的速度,您可能会认为这些是同时发生的(1/20 秒几乎无法察觉),但实际上它们不是,它们是连续的。

这也可能令人感兴趣:http://en.wikipedia.org/wiki/Concurrency_control#Database_transaction_and_the_ACID_rules