MySQL的事务

一、什么是事务?

事务时一组操作的集合,他是一个不可分割的单位。事务会把所有的操作作为一个整体,一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

示例:
数据准备:

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两个账户都没有发生变化

MySQL 事务是指一组数据库操作,这些操作要么全部执行,要么全部不执行,其目的是保证在并发环境下,数据的一致性和完整性。MySQL 事务具有 ACID 性质,即原子性、一致性、隔离性和持久性。 MySQL 中使用事务需要使用 BEGIN、COMMIT 和 ROLLBACK 语句,其中 BEGIN 表示开启一个事务,COMMIT 表示提交事务,ROLLBACK 表示回滚事务事务的基本语法如下: ``` BEGIN; -- 执行一组数据库操作 COMMIT; -- 提交事务 -- 或者 ROLLBACK; -- 回滚事务 ``` 在 MySQL 中,事务的隔离级别分为四个等级,分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable。隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。 MySQL 事务的 ACID 性质有以下含义: 1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不会只执行其中的一部分操作。 2. 一致性(Consistency):事务执行前后,数据库中的数据必须保持一致性状态,即满足数据库的约束条件和完整性规则。 3. 隔离性(Isolation):事务之间应该是相互隔离的,一个事务的执行不应该被其他事务干扰,保证事务之间的数据相互独立。 4. 持久性(Durability):事务提交后,对数据库的修改应该是永久性的,即使出现系统故障或电源故障,也不应该对数据产生影响。 总之,MySQL 事务是一组数据库操作,具有 ACID 性质,可以通过 BEGIN、COMMIT 和 ROLLBACK 语句来实现,隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值