mysql事务操作_mysql的事务操作

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

少废话,是上代码:

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知识教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《ASP.NET Core 6框架揭秘》实例演示[16]:内存缓存与分布式缓存的使用

.NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存。前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一个独立的“中心数据库”。对于分…

高可用架构-- MySQL主从复制的配置

环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6.26.tar.gz 主节点IP:192.168.1.205 主机名:edu-mysql-01 从节点IP:192.168.1.206 主机名:edu-mysql-02 主机配置:4核CPU、4…

java 数组冒泡排序、转置(降序)

1.java 数组冒泡排序 排序的基本原理(升序): 原始数据: 2 、1 、9 、0 、5 、3 、7 、6 、8; 第一次排序: 1 、2 、0 、5 、3 、7 、6 、8 、9 ; 第二次排序: 1 、0 、2 、…

人工智能教程007:创建一个卷积神经网络(2)

2019独角兽企业重金招聘Python工程师标准>>> 我们如何对图像应用卷积 当我们在图像上应用卷积时,我们在两个维度上执行卷积——水平和竖直方向。我们混合两桶信息:第一桶是输入的图像,由三个矩阵构成——RGB三通道,其中…

释放mysql ibdata1文件_释放MySQL ibdata1文件的空间

在MySQL数据库中,如果不指定innodb_file_per_table参数,单独存在每个表的数据,MySQL的数据都会存放在ibdata1文件。mysql ibdata1存放数据,索引等,是MYSQL的最主要的数据。步骤:1,备份数据库从命…

【系统知识点】linux入门基础命令

大概总结了一下一些基础命令,仅仅是帮助基础使用linux文件系统,如果还有相关基础命令,希望大家留言一起补充汇总一下!命令的基本格式:格式:command [-options] parameter1 parameter2 …ps:第一…

Blazor University (48)依赖注入 —— Scoped 依赖

原文链接:https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/scoped-dependencies/Scoped 依赖Scoped 依赖项类似于 Singleton 依赖项,因为 Blazor 会将相同的实例注入到依赖它的每个对象中,但不同之处在…

c 连接mysql怎么增删改_C++ API方式连接mysql数据库实现增删改查

这里复制的http://www.bitscn.com/pdb/mysql/201407/226252.html一、环境配置1,装好mysql,新建一个C控制台工程(从最简单的弄起,这个会了,可以往任何c工程移植),在vs2010中设置,工程--属性--VC目录--包含目…

阿里云如何实现海量短视频的极速分发?答案在这里!

摘要:短视频行业目前比较火热,但是如何快速的实现海量短视频的极速分发,对于短视频业务提供方来讲是一个比较棘手的问题。阿里云技术专家将带领大家从视频的上传、采集、存储和CDN分发等方面为我们介绍阿里云的整体方案,并且重点讲…

GitHub项目管理维护实用教程

GitHub项目维护教程 1)注册GitHub账户并登陆; 2)在Windows cmd(或Ubuntu中的terminal)中cd到自己的工作目录,将仓库clone下来: 命令: 1 git clone https://github.com/... #项目地址…

图文详解cacti的安装和使用

简介: 1.cacti介绍2.安装服务端3.安装客户端4.添加监控的设备cacti的介绍Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂…

记一次 .NET 某金融企业 WPF 程序卡死分析

一:背景 1. 讲故事前段时间遇到了一个难度比较高的 dump,经过几个小时的探索,终于给找出来了,在这里做一下整理,希望对大家有所帮助,对自己也是一个总结,好了,老规矩,上 …

如何将图片放到mysql_怎么将图片添加到mysql中

将图片添加到mysql中的方法:首先将数据库存储图片的字段类型设置为blob二进制大对象类型;然后将图片流转化为二进制;最后将图片插入数据库即可。正常的图片储存要么放进本地磁盘,要么就存进数据库。存入本地很简单,现在…

Java线程与Linux内核线程的映射关系

http://blog.sina.com.cn/s/blog_605f5b4f010198b5.html Linux从内核2.6開始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。Java里的线程是由JVM来管理的。它怎样相应到操作系统的线程是由JVM的实现来确定的。L…

YoursLC 有源 低代码 项目介绍

YoursLC 是我们独立研发的一款低代码产品,YoursLC-yours你们的、LC是低代码low-code的缩写,中文名称:有源低代码, 是一套双输出的低代码产品:既能完整输出功能又能100%输出源码。满足用户高效率、低成本和个性化的需求…

stm32电机控制定时器1_STM32通过PWM控制电机速度

做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速。分享本文了解如何通过PWM实现对电机速度的控制。PWM控制电机速度的基本原理PWM(Pulse Width Modulation),也就是脉冲宽度调制。PWM中有一个比较重要的概念,占空比&#xf…

走向无后端的系统开发实践:CRUD自动化与强约定的REST接口

2019独角兽企业重金招聘Python工程师标准>>> ttp://mp.weixin.qq.com/s?__bizMzAwMDU1MTE1OQ&idx1&mid2653548079&sn2377b625db58b2ea93c3ef2d87e4c395 转载于:https://my.oschina.net/yunjie/blog/806130

jsp连接数据库

有关web开发……其中的关键步骤: request.setCharacterEncoding("utf-8"); //获取用户名 String uNamerequest.getParameter("username"); //获取密码 String pwrequest.getParameter("password"); //编写sql语句 String sql"se…

C# 二十年语法变迁之 C#9参考

C# 二十年语法变迁之 C# 9参考自从 C# 于 2000 年推出以来,该语言的规模已经大大增加,我不确定任何人是否有可能在任何时候都对每一种语言特性都有深入的了解。因此,我想写一系列快速参考文章,总结自 C# 2.0 以来所有主要的新语言…

mysql char varchar 性能_Mysql小细节:varchar与char在性能上的特点

varchar与char的一个主要区别是存储方式的不同varchar 是变长存储占用的存储空间 存储内容实际大小 长度记录位char 是定长存储占用的存储空间 字段声明的宽度存储方式对性能是有影响的例如分别使用 varchar(10) 与 varchar(255) 定义一个字段,实际存储的字符串为…