mysql 基础操作笔记之一
一、MYSQL 的事务处理机制
参考博文 : MYSQL的事务处理功能 深入浅出mysql事务处理和锁机制 MySQL事务处理和锁定语句
简单介绍一下事务:
事务一般要满足4个条件:
原子性:事务在执行时,要做到“要么全做,要么不做”。也就是说不允许事务部分执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库的影响。
一致性: 事务的操作应该使数据库从一个一致性的状态变到另一个一致性的状态。例如网上购物,只有既让商品出库,又让商品进入客户的购物篮才能构成事务。
隔离性: 如果多个事务并发执行,应像各个事务独立执行一样。
持久性: 一个成功执行的事务对数据库的作用是持久的,即使数据库因故障出错,也应该能够恢复。
(PS)MYSQL 中只有 InnoDB 和 BDB 类型才能支持事务处理,其他类型不支持。
mysql 的事务处理机制主要有两种:
第一种是:以 BEGIN , ROLLBACK, COMMIT 来实现。建议使用这种方法来处理。
step1:BEGIN 开始一个事务
step2:执行mysql 语句,检测是否执行成功。
step3:检测失败就执行 ROLLBACK ,进行事务回滚
step4:按照事务需求,重复运行step2,3。
step5:COMMIT 事务确认。
// 下面代码在mysql控制台上测试运行过,没问题
mysql> use test; Database changed mysql> CREATE TABLE `dbtest`( -> id int(4) -> ) TYPE=INNODB; Query OK, 0 rows affected, 1 warning (0.05 sec) mysql> select * from dbtest -> ; Empty set (0.01 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into dbtest value(5); Query OK, 1 row affected (0.00 sec) mysql> insert into dbtest value(6); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from dbtest; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into dbtest values(7); Query OK, 1 row affected (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from dbtest; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.00 sec) mysql>
/** * 下面代码是在php上的类似实现 */ $handler=mysql_connect("localhost","root",""); mysql_select_db("task"); mysql_query("BEGIN");//开始事务定义 mysql_query('START TRANSACTION'); if(!mysql_query("insert into trans (id) values('2')")) { mysql_query("ROOLBACK");//判断当执行失败时回滚 } if(!mysql_query("insert into trans (id) values('4')")) { mysql_query("ROOLBACK");//判断执行失败回滚 } mysql_query("COMMIT");//执行事务mysql_close($handler);
第二种是直接用 SET 来改变mysql 的自动提交模式
mysql 是默认自动提交的,即我们提交一个query,它就直接执行。我们可以通过
SET AUTOCOMMIT = 0 ; 禁止自动提交
SET AUTOCOMMIT = 1 ; 开启自动提交
来实现事务处理。
要注意的是: 用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!所以推荐用第一种方法。