mysql事物:
概念:主要用于处理操作量大,复杂度高的数据(在人员管理系统中,如果删除一个人员,即需要删除人员的基本资料,也要删除该人员的相关信息,如部门,等等。这些数据库操作语句就构成一个事物!)。
事物是一组相关操作
在mysql中只有使用了innodb数据库引擎的数据库或表才支持事物。
事物处理可用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行
事物用来管理insert,update,delete语句
事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1、事务的原子性:一组事务,要么成功;要么撤回。
2、稳定性 : 有非法数据(外键约束之类),事务撤回。
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候把事务保存到日志里。
开始一个事物:Start transaction;
设置保存点:savepoint + 保存点名称;
回滚到保存点:Rollback to [savepoint] +保存点名称;
回滚:Rollback (可单独使用)
提交:Commit
这两个关键字提交和回滚主要用于MySQL的事务。
mysql> showdatabases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| caiyu |
| db16 |
| db1606 |
| mtomquery |
| mysql |
| performance_schema |
| test |
+--------------------+
8 rows in set (0.00 sec)
mysql> use db16;
Database changed
mysql> set namesgbk;
Query OK, 0 rows affected (0.00 sec)
mysql> select *from department;
+------+--------+------------+
| d_no | d_name | d_location |
+------+--------+------------+
| 10 | 产品部 | 上海 |
| 20 | 财务部 | 北京 |
| 30 | 人事部 | 广州 |
| 40 | 销售部 | 成都 |
+------+--------+------------+
4 rows in set (0.00 sec)
mysql> select *from employee;
+------+--------+-------+---------+----------+----------+------------+
| e_no | e_name | e_sex | dept_no |e_job | e_salary | hire_date |
+------+--------+-------+---------+----------+----------+------------+
| 1001 | 李强 | 1 | 20 | 会计 | 800 | 2015-9-9 |
| 1002 | 王刚 | 1 | 30 | HR | 1600 | 2014-10-9 |
| 1003 | 珊珊 | 0 | 30 | HR | 1250 | 2014-11-7 |
| 1004 | 张阳 | 1 | 20 | 出纳 | 2975 | 2015-4-9 |
| 1005 | 小丽 | 0 | 40 | 销售经理 | 2850 | 2015-2-10 |
| 1006 | 王二 | 1 | 10 | 产品策划 | 2450 | 2015-4-23 |
| 1007 | 小冬 | 1 | 40 | 销售经理 | 2750 | 2015-3-10 |
| 1008 | 码子 | 1 | 30 | HR | 1600 | 2014-10-9 |
| 1009 | 李四 | 1 | 20 | 会计 | 2450 | 2014-10-9 |
| 2001 | 小明 | 1 | 10 | 界面设计 | 2500 | 2016-02-10 |
+------+--------+-------+---------+----------+----------+------------+
10 rows in set (0.00 sec)
mysql> starttransaction; //开始一个事物
Query OK, 0 rows affected (0.00 sec)
mysql> savepointa; //设置保存点
Query OK, 0 rows affected (0.00 sec)
mysql> deletefrom employee where dept_no = (select d_no from department where
-> d_name = '财务部'); //子查询
Query OK, 3 rows affected (0.00 sec)
mysql> select *from employee;
+------+--------+-------+---------+----------+----------+------------+
| e_no | e_name | e_sex | dept_no |e_job | e_salary | hire_date |
+------+--------+-------+---------+----------+----------+------------+
| 1002 | 王刚 | 1 | 30 | HR | 1600 | 2014-10-9 |
| 1003 | 珊珊 | 0 | 30 | HR | 1250 | 2014-11-7 |
| 1005 | 小丽 | 0 | 40 | 销售经理 | 2850 | 2015-2-10 |
| 1006 | 王二 | 1 | 10 | 产品策划 | 2450 | 2015-4-23 |
| 1007 | 小冬 | 1 | 40 | 销售经理 | 2750 | 2015-3-10 |
| 1008 | 码子 | 1 | 30 | HR | 1600 | 2014-10-9 |
| 2001 | 小明 | 1 | 10 | 界面设计 | 2500 | 2016-02-10 |
+------+--------+-------+---------+----------+----------+------------+
7 rows in set (0.00 sec)
mysql> select *from department;
+------+--------+------------+
| d_no | d_name | d_location |
+------+--------+------------+
| 10 | 产品部 | 上海 |
| 20 | 财务部 | 北京 |
| 30 | 人事部 | 广州 |
| 40 | 销售部 | 成都 |
+------+--------+------------+
4 rows in set (0.00 sec)
mysql> delete fromdepartment where d_name = '财务部';
Query OK, 1 row affected (0.00 sec)
mysql> select *from department;
+------+--------+------------+
| d_no | d_name | d_location |
+------+--------+------------+
| 10 | 产品部 | 上海 |
| 30 | 人事部 | 广州 |
| 40 | 销售部 | 成都 |
+------+--------+------------+
3 rows in set (0.00 sec)
mysql> rollback; //回滚
Query OK, 0 rows affected (0.04 sec)
mysql> select *from department;
+------+--------+------------+
| d_no | d_name | d_location |
+------+--------+------------+
| 10 | 产品部 | 上海 |
| 20 | 财务部 | 北京 |
| 30 | 人事部 | 广州 |
| 40 | 销售部 | 成都 |
+------+--------+------------+
4 rows in set (0.00 sec)
mysql> select *from employee;
+------+--------+-------+---------+----------+----------+------------+
| e_no | e_name | e_sex | dept_no |e_job | e_salary | hire_date |
+------+--------+-------+---------+----------+----------+------------+
| 1001 | 李强 | 1 | 20 | 会计 | 800 | 2015-9-9 |
| 1002 | 王刚 | 1 | 30 | HR | 1600 | 2014-10-9 |
| 1003 | 珊珊 | 0 | 30 | HR | 1250 | 2014-11-7 |
| 1004 | 张阳 | 1 | 20 | 出纳 | 2975 | 2015-4-9 |
| 1005 | 小丽 | 0 | 40 | 销售经理 | 2850 | 2015-2-10 |
| 1006 | 王二 | 1 | 10 | 产品策划 | 2450 | 2015-4-23 |
| 1007 | 小冬 | 1 | 40 | 销售经理 | 2750 | 2015-3-10 |
| 1008 | 码子 | 1 | 30 | HR | 1600 | 2014-10-9 |
| 1009 | 李四 | 1 | 20 | 会计 | 2450 | 2014-10-9 |
| 2001 | 小明 | 1 | 10 | 界面设计 | 2500 | 2016-02-10 |
+------+--------+-------+---------+----------+----------+------------+
10 rows in set (0.00 sec)
mysql> commit; //提交
Query OK, 0 rows affected (0.00 sec)
mysql> select *from department;
+------+--------+------------+
| d_no | d_name | d_location |
+------+--------+------------+
| 10 | 产品部 | 上海 |
| 30 | 人事部 | 广州 |
| 40 | 销售部 | 成都 |
+------+--------+------------+
3 rows in set (0.00 sec)
mysql> select *from employee;
+------+--------+-------+---------+----------+----------+------------+
| e_no | e_name | e_sex | dept_no |e_job | e_salary | hire_date |
+------+--------+-------+---------+----------+----------+------------+
| 1002 | 王刚 | 1 | 30 | HR | 1600 | 2014-10-9 |
| 1003 | 珊珊 | 0 | 30 | HR | 1250 | 2014-11-7 |
| 1005 | 小丽 | 0 | 40 | 销售经理 | 2850 | 2015-2-10 |
| 1006 | 王二 | 1 | 10 | 产品策划 | 2450 | 2015-4-23 |
| 1007 | 小冬 | 1 | 40 | 销售经理 | 2750 | 2015-3-10 |
| 1008 | 码子 |1 | 30 | HR | 1600 | 2014-10-9 |
| 2001 | 小明 | 1 | 10 | 界面设计 | 2500 | 2016-02-10
+------+--------+-------+---------+----------+----------+------------+
7 rows in set (0.00 sec)
步骤:1.开始一个事物 2.设置保存点 3.进行相应操作(这里是删除财务部的员工和财务部部门)
4.查询发现财务部和财务部员工已删除 5.回滚
6.重新查询两张表,发现删除的内容又回滚了(如果确认操作就不用回滚,用commit提交)