目录
事务
定义
数据库的事务(Transaction)是一个机制、一个操作序列,包含了一组数据库操作命令。
事务把所有的额命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败。
事务是一个不可分割的工作单元。
举例
张三有1000元,李四有500元,要完成--李四转账500元给李四这个操作。分为3步:第一步:查询张三账户余额是否超过500元。第二步:(转账500元)李四账户-500元。第三步:(查看李四账户是否多了500元)李四账户余额+500元。 若在第二步出现故障,异常;那么500元就丢失了。所以体现出事务的重要性。要么同时完成,要么同时失败。若中间出现异常,则可以回滚事务。
-- 开启事务
start transaction;
-- 或start begin;
-- 提交事务
commit;
-- 回滚事务
rollback;
事务案例
drop table if exists account;
-- 创建账户表
create table account(
id int PRIMARY KEY auto_increment,
name varchar(10),
money double(10,2)
);
-- 添加数据
insert into account(name,money) values ('张三',1000),('李四',1000);
-- 查看账户表
select * from account;
--
update account set money=1000;
-- 演示转账操作 李四转给张三500元
-- 转账正常情况
-- 1.查询李四余额
select * from account where name='李四';
-- 2.李四金额-500
update account set money=money-500 where name='李四';
-- 3.张三金额+500
update account set money=money+500 where name='张三';
不用事务模拟正常转账情况
注:第一个查询模拟李四,第二个查询模拟张三
不用事务正常转账完成后李四账户
不用事务正常转账完成后张三账户
不用事务模拟异常
update account set money=1000;
-- 演示转账操作 李四转给张三500元
-- 转账异常情况
-- 1.查询李四余额
-- select * from account where name='李四';
-- 注:第一步查询不改变表,可以略掉
-- 2.李四金额-500
update account set money=money-500 where name='李四';
出错了...
-- 3.张三金额+500
update account set money=money+500 where name='张三';
第二步出现异常,导致第三步没有执行,李四账户-500,但是张三账户没有变化。
不用事务异常转账完成后李四账户
转账出问题李四账户 发现李四账户少了500
不用事务异常转账完成后张三账户
转账出问题张三账户 发现张三账户没有变化
用事务进行模拟异常
update account set money=1000;
-- 演示转账操作 李四转给张三500元
-- 利用事务进行转账异常操作
-- 开启事务
begin;
-- 1.查询李四余额
-- select * from account where name='李四';
-- 注:第一步查询不改变表,可以略掉
-- 2.李四金额-500
update account set money=money-500 where name='李四';
出错了...
-- 3.张三金额+500
update account set money=money+500 where name='张三';
-- 回滚事务
rollback; -- 回滚到开启事务之前的状态
-- 再次查询
select * from account;
用事务模拟正常
update account set money=1000;
-- 演示转账操作 李四转给张三500元
-- 利用事务进行转账正常操作
-- 开启事务
begin;
-- 1.查询李四余额
-- select * from account where name='李四';
-- 注:第一步查询不改变表,可以略掉
-- 2.李四金额-500
update account set money=money-500 where name='李四';
-- 3.张三金额+500
update account set money=money+500 where name='张三';
-- 提交事务
commit; -- 永久保存
-- 再次查询
select * from account; -- 转账成功
事务的四大特征(ACID):
原子性
事务是不可分割的最小单位,要么同时成功,要么同时失败。
一致性
事务完成时,必须使所有的数据都保持一致状态。
隔离性
多个事务之间,操作的可见性。
持久性
事务一旦提交或回滚,他对数据库中的数据的改变就是永久的。
事务的提交方式
查询事务的默认提交方式
此时张三李四都能查看
-- 查询事务的默认提交方式
select @@autocommit; -- 默认方式自动提交
select * from account;
-- 李四金额-500
update account set money=money-500 where name='李四';
修改事务的提交方式,手动提交
此时只能李四查看,张三不能查看
-- 修改事务的提交方式,手动提交
set @@autocommit=0;
-- 李四金额-500
update account set money=money-500 where name='李四';
-- 查看
select * from account;