1. 什么是事务
概念:事务是作为一个独立单元的一组有序的数据库操作。如果一组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作成功完成,事务则被提交(commit),其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚(roll back),该事务所有操作的影响都将被取消。
事务期间所造成的任何修改只作用于拥有该事物的线程,并一直保持如此,直到所有修改确实被提交。这就防止了其他线程可能利用很快就会因为回滚而取消的数据,否则这会破坏数据的完整性。
4个原则:
原子性:事务的所有步骤都必须成功完成;否则,任何步骤都不会被提交。
一致性:事务的所有步骤都必须成功完成;否则,所有数据都将恢复到事务开始之前的状态。
隔离性:未完成事务所做的步骤必须与系统隔离,直到认为事务完成为止。
持久性:所有提交的数据都必须由系统以某种方式保存:使得一旦系统出现故障,数据可以成功地返回到合法的状态。
可以使用 SHOW ENGINES 命令查看你的 MySQL 服务器支持的所有存储引擎。
2. 用法提示
这里给出使用 MySQL 事务时要记住的一些提示。
启动 START TRANSACTION 命令与将 AUTOCOMMIT 变量设置为0是一样的。默认值为 AUTOCOMMIT=1,这意味着每条语句都会在成功执行后被马上提交。这就是用 START TRANSACTION 命令开始事务的原因,因为你并不希望事务的每个部分一旦执行就被提交。
只有在必须保证整个过程成功执行时才是用事务。例如,向购物车增加一件商品时,就必须整个过程都成功执行,而浏览所有可购买的商品时,这一点则并不重要。在设计表时要考虑这些问题,因为这会影响性能。
不能回滚数据定义语言(DDL)语句,即任何用于创建或删除数据库,以及创建、删除或修改表的语句。
事务无法嵌套。在 COMMIT 和 ROLLBACK 前执行多个 START TRANSACTION 命令没有意义。
如果在事务期间更新一个非事务表,然后用 ROLLBACK 结束事务,将返回一个错误,提示非事务表无法回滚。
要经常创建 InnoDB 数据和日志的快照(为此需要备份二进制日志文件,以及使用 mysqldump 创建每个表中数据的快照)。
本文章内容来自于 《PHP与MySQL程序设计》 书中第37章,在这里写一遍可以加深记忆。