1.3. 事务如果不了解事务,你就不可能了解数据库系统的更高级的特性。所谓事务是指,数据库将一组SQL语句当做......
1.3. 事务
如果不了解事务,你就不可能了解数据库系统的更高级的特性。所谓事务是指,数据库将一组SQL语句当做“原子化”来处理,作为一个独立的工作单元。如果数据库引擎可以执行整组的SQL语句,那么它就执行整组语句;如果组中任何一个SQL语句因为某种原因而失败,那么任何一条语句都不会实际生效。这就是“要么全部要么没有”的策略。
本节只有很少的内容是针对MySQL的。如果你已经对ACID事务比较熟悉,那么你可直接跳到“节1.3.4 MySQL中的事务”。
一个银行应用可以作为典型的例子来说明为什么需要事务。设想一个银行的数据库有两张表,checking和savings。从Jane的checking帐户中转200美元到savings帐户中,你可能需要进行至少三步操作:
1、确定她的checking帐户中的余额超过200美元
2、从她的checking帐户中减去200美元
3、给她的savings帐户中增加200美元的余额
整个操作应该被包在一个事务中来执行,这样来看如果其中任何一步失败了整个步骤就可以回滚。
你可以用“START TRANSACTION”语句来开始一个事务,然后要么利用“COMMIT”来将改变的数据持久化,要么利用“ROLLBACK”来放弃前面的操作。因此我们前面提到的事务例子的SQL语句可能如下这样
但是事务并不是全部。当数据库服务器在执行第4条语句时出现错误会发生什么事呢?这个谁知道?也许客户正好损失了200美元。如果另外的进程在当前进程执行到第3句和第4句之间的时候把checking帐户的余额全部取走又会发生什么事情呢?那么银行将会在不知情的情况下给用户200美元。
除非系统通过了ACID测试,否则事务就是不完善的。ACID代表Atomicity原子性,Consistency一致性,Isolation隔离性,Durability持久性。这些紧密联系的标准必须为一个表现良好的事务处理系统所遵守:
Atomicity原子性
一个事务必须像一个不可分割的工作单元一样工作,这样一来可以使得整个事务要么被执行要么回滚。当事务是原子的时候,就不存在部分完成的事务,也即“要么全部要么没有”。
1/7 1 2 3 4 5 6 下一页 尾页 |