0


【MySQL】不就是事务

前言

嗨咯,小伙伴们大家好呀,我已经一个星期没有更新了,实在抱歉!本期我们要学习MySQL初阶中的最后一课,MySQL数据库中的事务也算是近几年面试必考的问题,所以我们一定要认真学习。

目录

一、事务的简介

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

普法课堂:法外狂徒”张三“昨天偷了李四5000元存入银行中,张三第二天良心发现犹豫再三决定告诉李四这件事情。李四听了这件事情后决定给张三一个重新做人的机会。只要张三把钱归还给自己,之前的事情既往不咎。张三也在第二天匆匆地赶去银行把自己账户中的5000元通过银行转账归还给李四。张三查了查自己的账户里边有5000元。

现在我们想一下转账的流程:张三账户-5000元——>李四的账户+5000元。

张三在银行中的确把所偷盗的五千元转给了李四。银行的工作人员说最晚48小时内李四就可以收到,但是时间一转眼过去了一周,李四没有收到张三归还的五千元,李四报了警!

最后因为银行系统出现故障导致李四无法收到转账!最后请问张三构成犯罪吗?这就是我们今天要学习的事务,要么张三银行账户-5000,李四银行账户+5000,要么张三账户不扣钱,李四也不加钱。

注意:默认MvSQL的事务是自动提交的,也就是说,当执行一条DML(insert、update、delete、select)语句,MvSQL会立即隐式的提交事务。

二、事务操作

2.1 查看/设置事务提交方式

select @@autocommit;

2.2 手动开启事务

start transaction;
begin;

2.3 提交事务

commit;

2.4 回滚事务

rollback;

2.5 案例练习

2.5.1 查看MySQL事务
select @@autocommit;

为1表示自动提交,为0表示需要手动提交事务,改为手动之后再提交事务时候必须使用commit,同时也需要自己进行回滚。

2.5.2 银行转账模拟练习
2.5.2.1 创建余额表

表结构如下

create table account
(
    id    int auto_increment primary key comment '用户id',
    name  varchar(10) comment '姓名',
    money int comment '余额'
);

添加数据

insert into account values('001','李白',5000),('002','杜甫',3000),('003','白居易',2500);
2.5.2.2 模拟转账流程 李白给杜甫转账1000元 (自动提交事务模式)

1.查询李白的账户

select * from account where name='李白';

2.李白的账户减去1000

update account set money=money-1000 where name='李白';

3.杜甫的账户增加1000

update account set money=money+1000 where name='杜甫';

4.查询账户表

select * from account;

2.5.2.3 模拟转账流程 李白给杜甫转账1000元 (手动提交事务模式)

设置MySQL为自动提交事务,设置autocommit为0。

set @@autocommit=0;

1.开启事务

start transaction;

以下插入数据对数据进行操作的流程同2.5.2.2。

执行出错,要对事务进行回滚。要么全部执行,要么一个也不执行。

n.提交事务

commit;

三、事务的四大特性

原子性:(Atomicity): 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性:(Consistency):事务完成时,必须使所有的数据都保持一致状态。

隔离性:(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性:(Durability): 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

!!!面试的时候容易考

四、并发事务问题与事务的隔离级别

4.1 并发事务的问题

4.2 事务的隔离别

注意: 事物的隔离级别越高,数据越安全,但是性能越低。 需要去权衡数据的安全性和并发性,进行设置事物的隔离级别。

4.3 相关语句

4.3.1 查看事务的隔离界别

select @transaction_isolation;

4.3.2 设置事务的隔离界别

set
[session/global] transaction isolation level [read uncommitted | read committed |repeatable read |serializable];

4.4 实战练习

4.4.1 打开两个客户端进行操作
4.4.2 查看事务隔离级别
select @@transaction_isolation;

事务的隔离级别为默认值.

set session transaction isolation level read uncommitted;
4.4.3 查看当前表中的数据

4.4.4 在另一个客户端进行更新操作
set session transaction isolation level read uncommitted;
4.4.5 再另一个客户端进行查询操作

因为另一个客户端没有进行commit提交操作所以出现脏读。

4.4.6 设置事务隔离级别为read committed
set session transaction isolation level read committed;

提交事务之前于提交事务之后查询的李白的money不相同出现了不可重复读。

4.4.7 设置为repeatable read
set session transaction isolation level repeatable read;

在一个客户端查询id=4是否存在

select * from account where id='4';

在另一个客户端插入一条数据

select * from account where id='4';

在第一个客户端插入数据出现错误,但是查询id=4的仍然为空

select * from account where id='4';

出现幻读现象

4.4.8 设置事务的隔离级别为serializable;

当一个事务提交之后完毕之后另一个事务才开始执行,规避了幻读的问题。

注意:事务的隔离级别越高,数据越安全,但是性能越低。

五、总结

在过去的一段时间里,我一直与大家分享关于MySQL数据库的知识和经验。我希望这些博文能够帮助你们更好地理解和应用MySQL,提升你们在数据库领域的技能。 然而,我认为现在是时候告别了。

我已经完成了初级阶段的博文学习,我相信你们已经掌握了一些基本的MySQL知识,并能够应用到实际项目中。 在这个阶段结束之际,我想向你们表达我的感激之情。感谢你们一直以来的支持和鼓励,是你们的反馈和建议让我不断进步。我也希望你们能够继续保持学习的热情,不断提升自己的技能。

如果你们还有任何关于MySQL数据库的问题,可以随时在评论区留言,我会尽力回答。同时,我也鼓励你们互相交流和分享,共同进步。 最后,我想再次感谢你们的支持和陪伴。希望我们能够在其他的学习领域再次相遇。 再见!

标签: mysql 数据库 sql

本文转载自: https://blog.csdn.net/m0_64857213/article/details/131479270
版权归原作者 Super大雄 所有, 如有侵权,请联系我们删除。

“【MySQL】不就是事务”的评论:

还没有评论