DBMS 中的事务管理,事务是一组逻辑相关的操作。例如,您正在将资金从您的银行帐户转移到您朋友的帐户,操作集将如下所示:
简单事务示例
- 阅读您的账户余额
- 扣除余额中的金额
- 将余额写入您的账户
- 读取您朋友的账户余额
- 将金额添加到他的账户余额
- 将新的更新余额写入其账户
这整组操作可以称为事务。虽然我已在上面的示例中向您展示了读取,写入和更新操作,但事务可以具有读取,写入,插入,更新,删除等操作。
在 DBMS 中,我们写下以下 6 个步骤的事务:
假设您的账户是 A 而您朋友的账户是 B,您要从 A 转移 10000 到 B,事务的步骤是:
1. R(A);
2. A = A - 10000;
3. W(A);
4. R(B);
5. B = B + 10000;
6. W(B);
在上述事务中 R
是指读操作, W
是指写操作。
操作之间的事务失败
现在我们了解什么是事务,我们应该了解与之相关的问题。
事务期间可能发生的主要问题是在完成集合中的所有操作之前事务可能会失败。这可能是由于电源故障,系统崩溃等原因造成的。这是一个严重的问题,可能会使数据库处于不一致状态。假设事务在第三次操作后失败(参见上面的示例),那么金额将从您的帐户中扣除,但您的朋友将不会收到该金额。
为了解决这个问题,我们有以下两个操作:
- 提交:如果事务中的所有操作都成功完成,则永久地将这些更改提交到数据库。
-
回滚:如果任何操作失败,则回滚之前操作完成的所有更改。
即使这些操作可以帮助我们避免在事务期间可能出现的几个问题,但是当两个事务同时运行时它们是不够的。要处理这些问题,我们需要了解数据库 ACID 属性。