事务是以单个原子操作完成的工作单元,也就是说,该操作要么整体成功,要么整体失败。 例如,考虑将资金从一个银行账户转移到另一个银行账户。 这涉及两个步骤:从第一个帐户提取资金,并将其存入第二个帐户。 这两个步骤都很重要:一个步骤成功,另一个步骤失败是不能接受的。 支持事务的数据库能够保证这一点。
可以通过 提交 或 回滚来完成事务。 在提交事务时,该事务中所做的更改将被永久保留。 回滚事务时,受影响的行将返回到事务启动前的状态。 为了扩展帐户转移示例,应用程序执行一个 SQL 语句来借记第一个帐户,另一个 SQL 语句用于对第二个帐户进行信用。 如果这两条语句都执行成功,应用程序则会提交事务。 但是,如果任一语句由于任何原因失败,应用程序将回滚该事务。 在任一情况下,应用程序都保证事务结束时的状态一致。
单个事务可以包含在不同时间发生的多个数据库操作。 如果其他事务完全有权访问中间结果数据,则事务可能会相互干扰。 例如,假设一个事务插入一行,第二个事务读取该行,而第一个事务被回滚。 第二个事务现在具有不存在的行的数据。
为了解决此问题,有多种方案可以将事务彼此隔离。 事务隔离 通常由锁定行实现,这阻止多个事务同时使用同一行。 在某些数据库中,锁定行也可能锁定其他行。
随着事务隔离程度的提高,并发性降低,即两个事务同时使用同一数据的能力减弱。 有关详细信息,请参阅 设置事务隔离级别。
本部分包含以下主题。