database-design - 事务处理 : How are simultaneous transaction managed?

标签 database-design transactions database-connection parallel-processing

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

最佳答案

这是一个非常复杂的话题的好问题。有一个技术数据库术语,事务,它保证两个冲突的操作不会同时发生;这是通过实现 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

关于database-design - 事务处理 : How are simultaneous transaction managed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6703897/

相关文章:

sql - Postgresql:一列表的主键

mysql - NamedParameterJdbcTemplate.update 如何真正与 Spring 和 MySQL 一起工作

java - 关闭连接会自动关闭语句和结果集吗?

php - PDO 连接 AWS RDS 字符集

java - 在 java 命令行应用程序中创建连接池

mysql - 留言板结构数据库

mysql - 评级系统查询

database-design - 支持仅适用于特定行的值的最佳数据库架构是什么?

java - 为什么 Spring Roo 给 persist() Propogation.REQUIRES_NEW

c# - 使用 MySqlTransaction 回滚