Mysql之事务

来源:互联网 发布:mac diva和dare you 编辑:程序博客网 时间:2024/06/06 09:05
事务是一组原子性的sql查询语句,也可以被看作一个工作单元。如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有的查询,但是如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的sql都不会执行。也就是说,要么全部执行,要么一句也不执行。

银行应用应该算是一个经典的案例。可以解释事务应用的必要性。假设一银行数据库有两张表,checking表和saving表。现在A的支票帐户要转帐200元到他的存款帐户,那么最少需要完成三步操作:

1、检查支票存款帐户的余额是否大于200;

2、从支票帐户余额中减去200;

3、在存款帐户余额中增加200。

所有的操作都要在一个事务中执行,如果某一步失败,就回滚所有已完成的步骤。

那么可以用START TRANSACTION语句开始一个事务,用COMMIT语句提交整个事务,永久地修改数据,或者用ROOLBACK回滚整个事务,取消已经做的修改。事务sql的样本如下:

1  START TRANSACTION;2  SELECT balance FROM checking WHERE customer_id = 1029;3  UPDATE checking SET balance=balance-200.00 WHERE customer_id=1029;4  UPDATE saving SET balance=balance+200.00 WHERE customer_id=1029;5  COMMIT;

当然单纯的事务概念并不是全部的主题。试想一下,如果数据库服务器在执行第4条语句时突然崩溃,会发生什么事?没人知道,但用户可以会损失200元。再假如,在执行第3和第4条语句之间时,另一个进程同时运行,它的目的是先删除支票帐户的全部余额,那么结果可能是,银行根本不知道有这个逻辑先发事件,则白白给用户增加了200元。

除非系统通过ACID测试。否则空谈事务概念是不够的。ACID代表了原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些概念与事务的处理标准密切相关。一个有效的事务处理系统必须满足相关标准。

原子性Atomicity)

一个事务必须被视为一个单独的内部“不可分”的工作单元,以确保整个事务要么全部执行,要么全部回滚。当一个事务具有原子性时,该事务绝对不会被部分执行,要么完全执行,要么根本不执行。

一致性(Consistency)

数据库总是从一种一致性状态转换到另一种一致性状态。在上述例子中,一致性确保了,即使数据库系统在执行第3、4条语句时崩溃了,支票存款帐户也不会损失200元。因为最终事务根本没有被提交,任何事务处理过程中所做的数据改变,也不会影响数据库的内容。

隔离性(Isolation)

个事务的结果只在完成之后才对其他事务可见。在上述例子中,当数据库执行完第3条语句,还未执行第4条语句时,如果此时银行汇总程序也同时运行,它将仍视转账的200元仍在支票存款帐户内。

持久性(Durability)

一旦一个事务提交,事务所做的数据改变将是永久的。这意味着数据改变已被记录,即使系统崩溃,数据也不会因此丢失。

ACID事务确保了银行不会弄丢你的钱,而这种特性在应用逻辑设计中是很难实现的,甚至不可能实现。一个ACID兼容的数据库服务器,要为事务处理做大量的复杂工作,确保ACID特性的实现。

原创粉丝点击