嗨咯,小伙伴们大家好呀,我已经一个星期没有更新了,实在抱歉!本期我们要学习MySQL初阶中的最后一课,MySQL数据库中的事务也算是近几年面试必考的问题,所以我们一定要认真学习。
前言
目录
一、事务的简介
二、事务操作
2.1 查看/设置事务提交方式
2.2 手动开启事务
2.3 提交事务
2.4 回滚事务
2.5 案例练习
2.5.1 查看MySQL事务
2.5.2 银行转账模拟练习
2.5.2.1 创建余额表
2.5.2.2 模拟转账流程 李白给杜甫转账1000元 (自动提交事务模式)
2.5.2.3 模拟转账流程 李白给杜甫转账1000元 (手动提交事务模式)
三、事务的四大特性
四、并发事务问题与事务的隔离级别
4.1 并发事务的问题
4.2 事务的隔离别
4.3 相关语句
4.3.1 查看事务的隔离界别
4.3.2 设置事务的隔离界别
4.4 实战练习
4.4.1 打开两个客户端进行操作编辑
4.4.2 查看事务隔离级别
4.4.3 查看当前表中的数据
4.4.4 在另一个客户端进行更新操作
4.4.5 再另一个客户端进行查询操作
4.4.6 设置事务隔离级别为read committed
4.4.7 设置为repeatable read
4.4.8 设置事务的隔离级别为serializable;
五、总结
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
普法课堂:法外狂徒”张三“昨天偷了李四5000元存入银行中,张三第二天良心发现犹豫再三决定告诉李四这件事情。李四听了这件事情后决定给张三一个重新做人的机会。只要张三把钱归还给自己,之前的事情既往不咎。张三也在第二天匆匆地赶去银行把自己账户中的5000元通过银行转账归还给李四。张三查了查自己的账户里边有5000元。
现在我们想一下转账的流程:张三账户-5000元——>李四的账户+5000元。
张三在银行中的确把所偷盗的五千元转给了李四。银行的工作人员说最晚48小时内李四就可以收到,但是时间一转眼过去了一周,李四没有收到张三归还的五千元,李四报了警!
最后因为银行系统出现故障导致李四无法收到转账!最后请问张三构成犯罪吗?这就是我们今天要学习的事务,要么张三银行账户-5000,李四银行账户+5000,要么张三账户不扣钱,李四也不加钱。
注意:默认MvSQL的事务是自动提交的,也就是说,当执行一条DML(insert、update、delete、select)语句,MvSQL会立即隐式的提交事务。
select @@autocommit;
start transaction;
begin;
commit;
rollback;
select @@autocommit;
为1表示自动提交,为0表示需要手动提交事务,改为手动之后再提交事务时候必须使用commit,同时也需要自己进行回滚。
表结构如下
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);
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;
设置MySQL为自动提交事务,设置autocommit为0。
set @@autocommit=0;
1.开启事务
start transaction;
以下插入数据对数据进行操作的流程同2.5.2.2。
执行出错,要对事务进行回滚。要么全部执行,要么一个也不执行。
n.提交事务
commit;
原子性:(Atomicity): 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性:(Consistency):事务完成时,必须使所有的数据都保持一致状态。
隔离性:(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性:(Durability): 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
!!!面试的时候容易考
注意: 事物的隔离级别越高,数据越安全,但是性能越低。 需要去权衡数据的安全性和并发性,进行设置事物的隔离级别。
select @transaction_isolation;
set
[session/global] transaction isolation level [read uncommitted | read committed |repeatable read |serializable];
select @@transaction_isolation;
事务的隔离级别为默认值.
set session transaction isolation level read uncommitted;
set session transaction isolation level read uncommitted;
因为另一个客户端没有进行commit提交操作所以出现脏读。
set session transaction isolation level read committed;
提交事务之前于提交事务之后查询的李白的money不相同出现了不可重复读。
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';
出现幻读现象
当一个事务提交之后完毕之后另一个事务才开始执行,规避了幻读的问题。
注意:事务的隔离级别越高,数据越安全,但是性能越低。
在过去的一段时间里,我一直与大家分享关于MySQL数据库的知识和经验。我希望这些博文能够帮助你们更好地理解和应用MySQL,提升你们在数据库领域的技能。 然而,我认为现在是时候告别了。
我已经完成了初级阶段的博文学习,我相信你们已经掌握了一些基本的MySQL知识,并能够应用到实际项目中。 在这个阶段结束之际,我想向你们表达我的感激之情。感谢你们一直以来的支持和鼓励,是你们的反馈和建议让我不断进步。我也希望你们能够继续保持学习的热情,不断提升自己的技能。
如果你们还有任何关于MySQL数据库的问题,可以随时在评论区留言,我会尽力回答。同时,我也鼓励你们互相交流和分享,共同进步。 最后,我想再次感谢你们的支持和陪伴。希望我们能够在其他的学习领域再次相遇。 再见!