Browsed by
分类:MySQL

浅谈 MySQL 中的事务和 ACID

浅谈 MySQL 中的事务和 ACID

所谓事务(Transaction),就是通过确保成批的操作要么完全执行,要么完全不执行,来维护数据库的完整性。举一个烂大街的例子:A 向 B 转账 1000 元,对应的 SQL 语句为:(没有显式定义事务

UPDATE deposit_table set deposit=deposit-1000 WHERE name='A';UPDATE deposit_table set deposit=deposit+1000 WHERE name='B';

运行后的结果如下

mysql> SELECT * FROM deposit_table;+------+---------+| name | deposit |+------+---------+| A    |    3000 || B    |    5000 |+------+---------+

这样做可能遇到问题,比如执行完第一条语句之后,数据库崩溃了,最后的结果就可能会是这样有待商榷,取决于下一条 SQL 有没有被写入日志

+------+---------+| name | deposit |+------+---------+| A    |    2000 || B    |    5000 |+------+---------+

A 的 1000 块钱平白无故消失了,这肯定不合适。事务就是为了解决类似的问题而出现的,如果使用事务来处理转账,对应的 SQL 就是

START TRANSACTION;UPDATE deposit_table set deposit=deposit-1000 WHERE name='A';UPDATE deposit_table set deposit=deposit+1000 WHERE name='B';COMMIT;

仅仅是在这原先的两条 SQL 语句前后加上了START TRANSACTIONCOMMIT,就可以保证即使转账操作失败,A 的余额也不会减少。

仔细想一想发现这个例子不是特别合适,因为数据库的故障恢复技术...

阅读全文 Read More