同一个事务中未提交的数据查不到_四、mysql进阶篇:P62-66 事务

本文深入探讨了MySQL中的事务知识,包括ACID特性中的隔离性,事务的开启、提交、回滚操作,以及并发操作时可能遇到的脏读问题和解决办法。通过实例展示了在不同隔离级别下,如何防止脏读,强调在开发中通常使用读提交模式。
摘要由CSDN通过智能技术生成

db652df905b5a174882fcd94bc26234c.png

本部分主要讲解mysql数据库中的进阶知识和实际操作1:事务。


ac56ef1586614e01187a08566a32a461.png

2.事务的ACID

c3ecdb261983b1183afe35f186f5a34a.png
  • 一致性:类似银行转账,张三的钱转给李四,张三的钱要减少,李四的钱要增加;
  • 隔离性:张三给李四转钱,张三选好数额,还没点提交,李四应该查不到收到钱了;
  • 持久性:张三给李四转钱,一旦转账成功,就拿不回来了,只能找银行处理;确认这件事发生了,就存在磁盘里面了;

二、事务的使用

2.1 概念

  • mysql默认事务是开启的,一条SQL语句一旦按下回车,就表示这个发生了;
  • 自己去写事务,要手动去开启事务,感觉哪个事务错了,就要进行回滚,

9155eda8f885886e1a4089d32c6fedbd.png

2.2 操作

2.1.1 原来的表

9155eda8f885886e1a4089d32c6fedbd.png

2.2 操作

2.1.1 原来的表

f661d6b6a4a878ced9f952fd39e5ef96.png

441a7357976ee58612a4d3ed1fe65beb.png

2.1.2 步骤

经过这几步操作之后:【黄色框线中】此时表中数据并未改变;

09b74c84e81c5117f9828c7c171cac5a.png
  • start transtion 先开启了事务; 后面两句update是合并成了一个事务,实际表中数据还没动,体现事务隔离性;
  • 最后事务确认完成,加一句commit,这就不能改变了

7be289ea314f94296359000d4afa0518.png

结果就是:

dc68a6a6eeabc55fb09be33f99c4a323.png

210271d4b24104e3c00c5af29150c0e3.png

三、提交及回滚事务

3.1 概念

0dd6722f80c733bee286d6a6d1eb0762.png

3.2 操作

原表:张三5000;李四1000;

CMD运行以下代码:

74ca1c778b6994c3b04850d546fcbff6.png
  • 但是在Navicat里面,新建的查询还是:

46d5527396affd9af8a0811c21bd6c1a.png

之所以CMD是3000,Navicat是5000,是因为cmd是后台看的,Navicat是客户看到的;

且事务只对DML语言有效,对DQL这种select查询语言无效;

  • 再运行一句:

7fb1c38d972aea8d5ad73cb38b95d87e.png
  • 如果此时因不可抗力,坏掉了:就要进行回滚rollback,这就撤回了事务;

7f39b1499aa9b6c216509f1ff4fce97a.png

3.3 事务流程图

3fd5f539a5497e06bb65d3677aa68220.png

四、事务的并发操作

要设置隔离级别,以免让后台的有些操作被客户看到,出现数额先增后减的情况;

4.1 事务的并发问题【多人同时去做某一件事情】

4.1.1 脏读案例

老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,

该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,

以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交

实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读.

4.1.2 脏读解决办法【read committed】

859c3112769086b32a16dad5e823a5fe.png
  • 四种隔离级别【级别权限从低到高】

read uncommitted读不可提交【脏读模式】;read committed读提交;repeatable read重复读【这个是默认】; serializable串行;

50c108041dbd218d714ba2d90c0508ce.png
  • 查看隔离级别:select @@global.tx isolation,@@tx isolation;

827606ee1d4fbbd33d675afa99424575.png
  • 修改隔离级别:【一个会话是一个小窗口;全局是指整个数据库里面】

87f7ffabcbf97ea73866c40b4657a392.png

4.1.3 脏读演示

4ddc0ca0457b62f2fe05d04fce87221b.png

8b3d0ff608250f7f8fa45329c42f2a38.png
  • 此时有:

46d5527396affd9af8a0811c21bd6c1a.png
  • 下一步:后台这样

7155972d53efed83c23aa7abab7a0d29.png

此时李四在自己APP上查到多了2000块钱

dc68a6a6eeabc55fb09be33f99c4a323.png

转账的人发现不应该转2000,就自己撤回了

61042dccc898c26d2219adebebe0cbde.png

李四自己什么都没干,再查了一遍就发现钱又变少了

56c6062c4e5f10d2b04099b42d424507.png

4.1.4 大多数用读提交模式【开发中不用脏读模式】

0f2dee4758d640ef35dbf04237e254b5.png

8a8f09179244ea2dac4d9a94c4270b93.png

a09c35cde82215e8d8dd9aae86ccd23f.png

此时李四在自己的APP上同时查看时,账上并没有多出2000


总结:

974d6134f0f5649b583bd6187311dd0a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值