《MySQL必知必会》学习笔记十六(事务处理)------掌握部分。
事务处理
什么是事务处理 如何管理事务处理
————————————– ————————————– ————————————–
注意:
并非所有的引擎指出事务处理。MyISAM(更常用) 和Innodb是两种最常用的引擎,前者(MyISAM )不支持明确的事务处理管理,后者(Innodb)支持。
如果你要在应用中需要事务处理功能,则一定要使用正确的引擎类型。
事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。
关系数据库设计把数据存储在多个表中,使数据更容易操纵、维护和重用。在某种程度上说,设计良好的数据库模式都是关联的。
事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,他们或者作为整体执行,或者完全不执行(除非明确指示)。如果没有错误发生,整组语句提交到数据库表,如果发生错误,则进行回退,以恢复数据库到某个已知且安全的状态。
就例如银行转账,汇款方和收款方对金额的改变就放在一个事务中,要么同时执行,要么同时不执行,这样的话,才能保证金额的正确性。
术语介绍:
1. 事务(transaction)指一组sql语句。
2. 回退(rollback) 指撤销指定sql语句的过程。
3. 提交(submmit)指将未存储的sql语句结果写入到数据库表中。
4. 保留点(savepoint)事务处理中设置的临时占位符,可以发布回退。
控制事务处理
管理事务处理的关键在于将sql语句组分解为逻辑块,并明确规定数据核实回退,何时不该回退。
事务开始
START TRANSACTION 标识着事务的开始
SELECT * FROM ordertotals;START TRANSACTION;DELETE FROM ordertotals;SELECT * FROM ordertotals;ROLLBACK;SELECT * FROM ordertotals;
首先执行一条SELECT以显示该表不为空。然后开始一个事务处理,用一条DELETE语句删除ordertotals 中的所有行,另一条SELECT 语句验证ordertotals确实为空。这时用一条ROLLBACK语句回退 START TRANSACTION 之后的所有语句,最后一条SELECT语句显示该表不为空。
事务回退
ROLLBACK 命令用来回退(撤销)MySQL语句。
ROLLBACK之能在一个事务处理内使用(在执行一条start transcation命令之后)
哪些语句可以退回?
事务处理用来管理insert、update。和delete语句的。不能退回select语句,不能退回create和drop 操作。可以在事务中使用,但是回退时,不会被撤销。
事务提交
使用 commit 关键字进行提交
一般的MySQL语句都是直接针对数据库表执行和编写的,这就是所谓的隐含提交,即提交操作时自动的。
在事务处理块中,提交不会隐含进行,需要进行明确的提交。使用commit语句进行提交。
START TRANSACTION;DELETE FROM orderitems WHERE order_num=20010;DELETE FROM orders WHERE order_num = 20010;COMMIT;
从系统中删除订单20010.因为涉及更新两个数据库表orders和orderitems ,所以使用事务处理块来保证订单不被部分删除。最后的COMMIT 语句 仅在不出错时写出更改。如果第一条DELETE起作用,但是第二条失败,则DELETE 不会被提交(会自动撤回)。
隐含事务关闭 当COMMIT 或者ROLLBACK 语句执行后,事务会进行自动关闭(预测将来的更改会隐含提交)。
使用保留点
简单的rollback和 commit语句就可以撤销或写入整个事务处理。但是,只是对简单的事务处理才能这样做。更复杂的事务处理可能需要部分提交或回退。
考虑前一个删除订单过程,如果发生错误,只需要返回到第一行即可,而不需要回退到整个开始(如果存在的话)。那么我们就需要保留点。
为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符。这样,如果需要回退,可以回退到某个占位符(保留点)。
语法: SAVEPOINT delete1;
每个保留点都取标识它的唯一名字,以便在回退时,MySQL知道回退到何处,为了回退到保留点,我们使用ROLLBACK delete1;语句进行回退。
保留点越多越好,因为保留点越多,我们就越能按照自己的意愿灵活地进行回退。
释放保留点 保留点在事务处理完成(执行ROLLBACK或COMMIT)后会自动释放。我们也可以利用RELEASE SAVEPOINT明确的释放保留点,一般都是默认的自释放。
更改默认的提交行为 // set autocommit=0;
默认的MySQL行为是自动提交所有更改。也就是说,任何时候你执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即执行。为了指示不自动提交更改,我们可以使用【 SET autocommit=0;】语句
autocommit 标志决定是否自动提交更改,不管有没有commit语句,设置autocommit为0(假)指示MySQL不自动提交更改(直到autocommit被设置为真为止)。
Autocommit 标识是针对每个连接而不是服务器的。