【MySQL】不就是事务
前言
嗨咯,小伙伴们大家好呀,我已经一个星期没有更新了,实在抱歉!本期我们要学习MySQL初阶中的最后一课,MySQL数据库中的事务也算是近几年面试必考的问题,所以我们一定要认真学习。
目录
2.5.2.2 模拟转账流程 李白给杜甫转账1000元 (自动提交事务模式)
2.5.2.3 模拟转账流程 李白给杜甫转账1000元 (手动提交事务模式)
一、事务的简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
普法课堂:法外狂徒”张三“昨天偷了李四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;
开启事务
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数据库的问题,可以随时在评论区留言,我会尽力回答。同时,我也鼓励你们互相交流和分享,共同进步。 最后,我想再次感谢你们的支持和陪伴。希望我们能够在其他的学习领域再次相遇。 再见!
来源地址:https://blog.csdn.net/m0_64857213/article/details/131479270
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341