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

时间:2011-07-15 07:33:37

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

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

2 个答案:

答案 0 :(得分:4)

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

  • 原子性表示整个交易发生,或者没有发生:要么从一个地方撤回资金,要么存入另一个地方,并记录整个交易(以及交易)成功完成),或者事务中止(回滚),好像什么也没发生;这保证你不能拥有,例如只是没有存款的提款。

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

  • 隔离表示发生的任何请求都可以假设没有其他任何内容触及数据 - 例如在您的情况下,ATM无需关心其他人是否正在尝试访问该帐户。这可能意味着执行速度变慢(“oops,现在无法访问此行,请稍候”),但显着简化了应用程序算法。

  • 持久性意味着即使系统崩溃,它仍然保持不变 - 即使断电也始终保持一致状态。

参见例如这有待进一步阅读:http://www.agiledata.org/essays/transactionControl.html

所以,在实践中,“同时”不会发生:一个请求将排在第一位,另一个请求排在第二位(因为第一个请求锁定了余额的行,第二个过程必须等到它变得可用)。由于孤立,没有必要担心“同时”:要么有足够的钱来提取现在,要么就没有;完全没有关系,另一个撤销排队并将在50毫秒内尝试(当第一个请求完成时,数据库会删除相关行上的锁定,并且队列中的下一个请求将会发生)。利用当前计算机的速度,您可以感知同时发生的事件(1/20秒几乎难以察觉),但实际上它们不是,它们是连续的。

这也可能是有意义的:http://en.wikipedia.org/wiki/Concurrency_control#Database_transaction_and_the_ACID_rules

答案 1 :(得分:3)

这取决于交易内部和transaction isolation level内发生的事情。例如,SERIALIZABLE(最高隔离级别)保证交易将一个接一个地执行。无论如何都将允许数据库连接,但可以回滚事务。