mysql:事务

目录

事务

定义

举例

事务案例

不用事务模拟正常转账情况

不用事务模拟异常

用事务进行模拟异常

用事务模拟正常

​编辑

事务的四大特征(ACID):

原子性

一致性

隔离性

持久性

事务的提交方式

查询事务的默认提交方式

修改事务的提交方式,手动提交


事务

定义

数据库的事务(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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自律的光电人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值