事物处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么全不执行。
- 事务:指一组sql语句
- 回退:指撤销指定的sql语句过程
- 提交:将未存储的sql语句结果写入数据库表
- 保留点:指事务处理过程中设置的临时占位符,可以对他发布回退,与回退到整个事务不同
开始事务
mysql> start transaction
回退事务
mysql> rollback
- 只能在一个事务内使用,即start transaction后
- 事务处理用来管理insert,update,delete语句,不能回退select语句,不能回退create和drop,事务处理块中可以使用着两条语句,如果回退执行,他们不会被撤消
mysql> select * from stu_info; +--------+---------+-----+-------+-------+ | num | name | age | grade | socre | +--------+---------+-----+-------+-------+ | 000001 | gushi | 23 | 1006 | 90 | | 000002 | hualian | 21 | 1005 | 100 | | 000004 | gushi | 16 | 1006 | 95 | | 000009 | abc | 8 | 2004 | 0 | +--------+---------+-----+-------+-------+ 4 rows in set (0.00 sec) mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> delete from stu_info; Query OK, 4 rows affected (0.00 sec) mysql> select * from stu_info; Empty set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.44 sec) mysql> select * from stu_info; +--------+---------+-----+-------+-------+ | num | name | age | grade | socre | +--------+---------+-----+-------+-------+ | 000001 | gushi | 23 | 1006 | 90 | | 000002 | hualian | 21 | 1005 | 100 | | 000004 | gushi | 16 | 1006 | 95 | | 000009 | abc | 8 | 2004 | 0 | +--------+---------+-----+-------+-------+ 4 rows in set (0.00 sec)
使用COMMIT
MySQL语句一般都是针对数据库表执行和编写的,这是所谓的隐含提交,即提交操作是自动进行的。但是在事务处理块中提交不会自动进行,为进行明确的提交,用commit
mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> delete from stu_info where age=18; Query OK, 5 rows affected (0.34 sec) mysql> delete from stu_info where age=20; Query OK, 0 rows affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.44 sec)
最后commit语句仅在不出错时写出更改,如果第一条delete起作用,第二条delete失败,则delete不会提交,实际上他是自动被撤销的
当COMMIT或rollback语句执行后,事务会自动关闭
保留点
COMMIT或rollback撤销的是整个事务,有时需要部分提交或回退,在事务块中放适当的占位符,如果需要回退,就会退到某个占位符。
mysql> savepoint s1;
每个保留点名字唯一
mysql> rollback to s1;
- 保留点越多越好
- 保留点在事务处理完成(执行一条rollback或COMMIT)后自动释放,也可以用release savepoint 明确释放保留点
更改默认的提交行为
mysql> set autocommit=0;
执行sql语句时,该语句都是针对表执行的,而且都是立即生效,autocommit决定是否自动提交,autocommit(0)假不自动提交,直到autocommit为真才自动提交,autocommit针对每个链接而不是服务器。