事务
事务(transaction)是数据库中执行同一业务多条SQL语句的工作单元,事务可以保证多条SQL语句全部执行成功或全部执行失败。
和事务相关的SQL语句:
begin: 开启事务
rollback: 回滚事务 把内存中的改动清除
commit: 提交事务 把内存中的改动一次性提交到磁盘中
验证事务:
- 创建表
create table user(
id int primary key auto_increment,
name varchar(10),
money int,
state varchar(5)
);
- 插入数据
insert into user values
(null,'李雷',5000,'正常'),
(null,'韩梅梅',50,'正常'),
(null,'Lucy',10,'冻结');
- 李雷给Lucy转账SQL:
update user set money=4000 where id=1 and state='正常';
update user set money=1010 where id=3 and state='正常';
select * from user;
- 以上代码无事务保护,则导致数据库内部的数据李雷丢了1000块钱
- 以下操作有事务保护的步骤:
- 开启事务:
begin;
- 让李雷-1000
update user set money=3000 where id=1 and state='正常';
- 让Lucy+1000
update user set money=1010 where id=3 and state='正常';
- 因为一条成功一条失败 所以不能把内存中的改变提交到磁盘中,所以需要执行回滚指令,执行之前可以打开另外一个窗口查看数据库中的数据是否发生改变(变的是内存中的数据,数据库里面的数据并没发生改变)
rollback;
- 转账成功执行流程:
- 开启事务
begin;
- 让李雷-1000
update user set money=3000 where id=1 and state='正常';
- 让韩梅梅+1000
update user set money=1050 where id=2 and state='正常';
- 由于转账业务的多条SQL全部执行成功 所以可以执行提交指令 把内存中的改动提交到磁盘中
commit;
第二种开启事务的方式
数据库中事务默认是自动提交的
- 查看数据库自动提交的状态
show variables like '%autocommit%';
- 修改自动提交的状态 0关闭 1 开启
set autocommit=0;
- 修改李雷钱为50000
update user set money=50000 where id=1;
- savepoint:保存回滚点
set autocommit=1;
李雷开始是50000
begin;
update user set money=10000 where id=1;
savepoint s1
update user set money=20000 where id=1;
savepoint s2
update user set money=30000 where id=1;
rollback to s1;
总结事务相关指令:
- begin 开启事务
- rollback 回滚事务
- commit 提交事务
- 查看自动提交状态 show variables like '%autocommit%'
- 修改自动提交状态 set autocommit=0/1;
- 保存回滚点 savepoint s1;
- 回滚到回滚点 rollback to s1;