一、什么是事务?
事务时一组操作的集合,他是一个不可分割的单位。事务会把所有的操作作为一个整体,一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
示例:
数据准备:
create table dept(
dept_id int(10) primary key,
name varchar(20),
local varchar(20)
);
create table emp(
emp_id int(10) primary key ,
name varchar(20),
gender varchar(2),
dept_id int(10)
);
insert into dept(dept_id,name,local) values (1,'人事部','北京');
insert into dept(dept_id,name,local) values (2,'财务部','南京');
insert into dept(dept_id,name,local) values (3,'咨询部','河南');
insert into emp(emp_id,name,gender,dept_id) values (1,'张三','男',1);
insert into emp(emp_id,name,gender,dept_id) values (2,'李四','女',1);
insert into emp(emp_id,name,gender,dept_id) values (3,'王五','男',1);
insert into emp(emp_id,name,gender,dept_id) values (4,'赵六','男',2);
insert into emp(emp_id,name,gender,dept_id) values (5,'钱七','女',2);
insert into emp(emp_id,name,gender,dept_id) values (6,'孙八','男',2);
insert into emp(emp_id,name,gender,dept_id) values (7,'思思','女',3);
insert into emp(emp_id,name,gender,dept_id) values (8,'菲菲','女',3);
insert into emp(emp_id,name,gender,dept_id) values (9,'GGBond','男',3);
部门表数据如下:
员工表数据如下:
此时如果人事部解散了,那么该部门和该部门下的员工都需要被删除:
-- 删除部门
delete from dept where dept_id = 1;
-- 删除部门下的员工
delete from emp where dept_id = 1;
正常情况下,1号部门人事部及其下的员工都会被删除
异常情况下,比如:
-- 删除部门
delete from dept where dept_id = 1;
-- 删除部门下的员工
delete from emp where dept_id < 1;
此时部门表中人事部被删除了,但部门下的员工没有被删除
为了解决这样情况,可以通过mysql中的事务来解决
二、事务操作
1.事务控制
开启事务:start transaction ; 或者 begin ;
提交事务:commit ;
回滚事务:rollback ;
示例:
-- 开启事务
start transaction ;
-- 删除部门
delete from dept where dept_id = 1;
-- 删除部门下的员工
delete from emp where dept_id = 1;
-- 提交事务
commit ;
-- 回滚事务
rollback ;
首先,先开启事务,执行 start transaction ; 然后执行删除部门和员工的操作,执行删除操作后,通过可视化工具看表中数据,会发现此时1号部门人事部和其下的员工还没被删除。但执行查询部门表和员工表的sql语句后会发现1号部门人事部和其下的员工已经被删除了,这是因为删除的操作还没有被提交,也就是事务的隔离性。
之后执行commit ; 该删除的数据被删除了。
如果删除语句出现错误,可以回滚数据。
示例:
-- 开启事务
start transaction ;
-- 删除部门
delete from dept where dept_id = 2;
-- 删除部门下的员工
delete from emp where dept_id == 2;
-- 提交事务
commit ;
-- 回滚事务
rollback ;
可以看到,删除员工的语句语法是错误的,如果没有事务,那么会出现2号部门删除成功,其下的员工删除失败,但是事务可以执行rollback ; 会将删除了的部门数据恢复过来
一旦出现异常,可以通过rollback ;将删除掉的数据恢复过来,从而保证在操作前后是一致的,要么同时成功,要么同时失败。
2.事务的四大特性(ACID)
2.1.原子性
事务是不可分割的最小单元,要么全部成功,要么全部失败。
2.2.一致性
事务完成时,必须使所有的数据都保持一致状态。
2.3.隔离性
数据库系统提供的隔离机制,保证事务在不受外部并发影响的独立环境下运行。
2.4.持久性
事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
3.事务的应用
转账:
A 向 B 转账1000块钱
B 接收 A 转过来的1000块钱
A 向 B 转账1000,A 的账户里会减少1000块钱
B 接收 A 转账,B 的账户里会增加1000块钱
这是不出意外的情况下,如果 A 转账完成,B 在接收900块钱后出现异常,那么如果没有事务,就会造成 A 的账户减少1000 ,但 B 的账户只增加了 900,这样就会导致 A 的账户凭空少了100块钱。
如果在事务的支持下,上面最终只有2种结果:
1、操作成功:A账户减少1000;B账户增加1000
2、操作失败:A、B两个账户都没有发生变化