倒着思考。杜绝纯粹的知识填鸭教育

少废话,是上代码:

update table1 set money-100 where id=1; //A账户减少100元

update table2 set money+100 where id=2; //B 账户增加100元

问题:这是一个简单的银行转账案例sql,由于服务器等未知原因,可能出现两条sql一个执行成功一个执行失败的情况下,一个账户没有成功增加100元,另一个账户缺减少了100元。要实现这两条sql语句必须都要成功或者都要失败。请问让你设计一种方案,怎么去着手?

初步思考方案一:每条sql语句都加判断,是否成功,失败就不再往下走

if(!mysql_query(update table1 set money-100 where id=1)){

//失败就停止退出

}

if(!mysql_query(update table1 set money-100 where id=1)){

//失败就停止退出

}

总结:仔细想,如果第一条语句执行成功了,而第二条语句执行失败了呢?

还不严谨。由此进一步考量,应该是无论哪条语句执行失败,都要能撤销已执行全部的操作。

设想:假如有这么一条命令叫做rollback,可以撤销已执行的全部操作。

那么修改后的方案二:

if(!mysql_query(update table1 set money-100 where id=1)){

//撤销

rollback

exit;

}

if(!mysql_query(update table1 set money-100 where id=1)){

//撤销

rollback

exit;

}

总结:貌似应该没问题了。再揣摩发现,我们撤销操作,应该是撤销到哪才算呢?不能把更早之前的所有执行的sql都撤销掉吧,起码有个位置。怎么办?在这两条语句前,加一个开始命令,只撤销到开始位置。

设想:有一个begin的开始命令。

那么修改后的方案三:

mysql_query(begin)

if(!mysql_query(update table1 set money-100 where id=1)){

//撤销

rollback

exit;

}

if(!mysql_query(update table1 set money-100 where id=1)){

//撤销

rollback

exit;

}

总结:这下貌似是真的可以了,再仔细揣摩发现,还有点问题,假如第一条语句执行成功了,突然服务器宕机了,命令没有再往下走,仍然是不行的。怎么办?在末尾加一个收尾的命令,如果mysql能执行到这条命令,那么才算真正完成数据更新了,不然以前的操作还都不算。

设想:有一个叫commit的收尾的命令

那么修改后的方案四:

mysql_query(begin)

if(!mysql_query(update table1 set money-100 where id=1)){

//撤销

rollback

exit;

}

if(!mysql_query(update table1 set money-100 where id=1)){

//撤销

rollback

exit;

}

mysql_query(commit)

-------------------------------------------------------------------------------------------------------------------------------

正着学习。弥补严谨自己的思维逻辑

学习下mysql中给我的解决方案,它把上述我们解决的问题叫做事务处理。

同样mysql为了解决上述的问题,也有三个命令,分别是begin、rollback、commit

一样的:

begin; //开启事务

update table1 set money-100 where id=1; //A账户减少100元

update table2 set money+100 where id=2; //B 账户增加100元

commit; //提交事务

准确的说:凡是事务内的语句,只要能被mysql接收到,都能保证全部执行,但是但是并不能保证都执行成功。失败时,需要自己主动去判断主动去回滚。(极其错误的认知:认为只要把事务写出来,最后用commit提交一下,数据库会自动判断这些语句是否全执行成功,如果成功则把所有的数据插入到数据库,如果有一条失败就自动回滚至原始状态!)

严格的事务使用流程案例演示

If(!mysql_query(begin)){

//如果事务没开启成功,那么后面的语句真的就是真实执行了,需要 主动判断一下

//退出

exit;

}

If(!mysql_query(update table1 set money-100 where id=1)){

//回滚

rollback

// 退出

}

If(!mysql_query(update table2 set money+100 where id=2)){

//回滚

rollback

//退出

}

If(!mysql_query(commit)){

//回滚

rollback //如果客户端把commit已经发送到了mysql执行,失败了,最好

也要判断主动立即去回滚,虽然数据库最终会慢慢自动回滚。因为事

务一直未提交,上面执行的写操作语句会给当前操作数据锁住,其

他用户不能操作这条数据,直到等待事务结束才能。(提交或回滚)。

}

有时候,根据业务需要,我们对操作的数据需要保持一个较高的一致性,可以考虑使用事务。

付费小密圈

1、解答大家php学习开发过程的问题

2、 分享不同php项目实战经验

3、定期邀请大牛进圈做知识分享

4、持续分享优质php知识教程

mysql事务操作_mysql的事务操作相关推荐

  1. mysql事务并发控制_MySQL之事务及并发控制

    本节索引: 一.事务Transaction 二.事务的隔离级别 三.并发控制 四.MVCC-多版本的并发控制协议 一.事务 什么是事务? 事务Transactions:一组原子性的SQL语句,或一个独 ...

  2. mysql语句中事务可靠性_MySql的事务使用与示例详解

    在MySQL中,事务就是一个逻辑工作单元的一系列步骤.事务是用来保证数据操作的安全性. 事务的特征: 1.Atomicity(原子性) 2.Consistency(稳定性,一致性) 3.Isolati ...

  3. mysql 业务账户_mysql的事务

    一.事务定义 Transaction 事务:一个最小的不可再分的工作单元:通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元) 一个完整的业务需要批量的DML(inse ...

  4. mysql有三种事务模式_MySQL之事务与三大范式

    一.MySQL事务 在MySQL中将一组有序的增删改操作看做一个独立的执行单元,当这一组所有的操作都成功,事务执行成功,如果其中有一个操作失败,事务执行回滚.MySQL 事务主要用于处理操作量大,复杂 ...

  5. mysql 数据库事务处理_MySQL数据库事务及其原理

    基本概念 MySQL 事务主要用于处理操作量大,复杂度高的数据. 银行转账是经典的解释事务的例子.用户A给用户B转账5000元主要步骤可以概括为如下两步. 第一,账户A账户减去5000元: 第二,账户 ...

  6. mysql 事务实例_mysql实现事务的提交和回滚实例

    mysql创建存储过程的官方语法为: 复制代码 代码如下:START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] R ...

  7. mysql 长事务查询_MySQL长事务详解

    前言: 『入门MySQL』系列文章已经完结,今后我的文章还是会以MySQL为主,主要记录下近期工作及学习遇到的场景或者自己的感悟想法,可能后续的文章不是那么连贯,但还是希望大家多多支持.言归正传,本篇 ...

  8. mysql事务 并发_Mysql关于事务并发带来的问题

    MySQL从5.5.8开始,Innodb就是默认的存储引擎,Innodb最大的特点是:支持事务.支持行级锁. 既然支持事务,那么就会有处理并发事务带来的问题:更新丢失.脏读.不可重复读.幻读:相应的为 ...

  9. mysql 5.1支持事务吗_MySQL的事务和隔离级别 | 旺旺知识库

    一.什么是事务? 数据库的事物,是指将一系列的操作作为一个逻辑单元来执行,即加入由十条SQL语句组成的一个事物,则要么则十条都执行成功,要么都不执行!事务处理可以确保除非事务性单元内的所有操作都成功完 ...

  10. mysql会话事务隔离_MySQL的事务隔离级别

    MySQL的事务隔离级别 隔离级别 1.事务的隔离级别决定了事务之间可见的级别. 2.当多个客户端并发地访问同一个表时,可能出现下面的一致性问题: ● 脏读取(Dirty Read) 一个事务开始读取 ...

最新文章

  1. Apache服务器主配置文件 httpd.conf 中文版
  2. bootstrap学习网站
  3. MongoDB 常用运算符
  4. 改变您一生的90/10原理
  5. python交流群教学视频_自学 Python,视频教程和代码一看就懂,动手就废,应该这么学...
  6. Flume监控几种方式
  7. python开发面试笔试题_python集合面试笔试题
  8. cordova+vue项目整合
  9. C 标准库 —— scanf(fflush(stdin))
  10. 使用generator自动生成mybatis model、mapper.xml、mapper等(转)
  11. 【渝粤题库】广东开放大学 管理会计 形成性考核
  12. ads pspice 导入_怎么由导入ADS中的pspice的参数模型得到器件模型?
  13. MPQ文件系统优化(续)
  14. 计算机识别不到硬盘,解决BIOS检测不到硬盘的问题
  15. 双非计算机硕士何去何从(2)
  16. 用HTML绘制哆啦A梦
  17. Java程序员面试笔试宝典答案,基于HTML
  18. 好奇那些进了大厂的程序员面试前都做了哪些准备?Android大厂面试官全套教程教你:这样准备面试顺利拿到offer
  19. c#和java部署pytorch同事识别两个图片_身份证OCR识别移动端amp;服务器
  20. 多多买菜,拼多多的第二增长曲线

热门文章

  1. 转载.Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
  2. BPM与Workflow的区别
  3. 技术分享 | 微服务模式下如何高效进行API测试
  4. 记一次 Oracle无法连接 问题分析
  5. C#获2021年度编程语言奖,开发者们最该关注这些亮点!
  6. Win11安卓极速教程!
  7. AWS 宣布创建“真正”开源的 Elasticsearch 分支
  8. 与您相约.NET Conf China 2020! 新进2位重磅嘉宾
  9. 跟我一起学.NetCore之选项(Options)核心类型简介
  10. 《ASP.NET Core 微服务实战》送书结果公告