MySQL数据库-MySQL事务操作(回滚)

事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。

举例:有这样一张表

从表里可以看出张三的资金里有850元,李四的资金有632元

假如张三向李四划款20元,那么张三的资金应该减20,李四的资金应该加20

UPDATE usr SET zij = zij - 20 WHERE yhm = '张三';
UPDATE usr SET zij = zij + 20 WHERE yhm = '李四';

可以看到张三的资金以减20,李四的资金以加20

但是如果在李四资金加的时候SQL语句出错,那么就会导致张三减少20成功,李四加上20失败,张三的资金减少了,李四资金没加上,钱就失踪了

UPDATE usr SET zij = zij - 20 WHERE yhm = '张三';
UPDATE usr2 SET zij = zij + 20 WHERE yhm = '李四';

定义一个存储过程来执行事务(回滚)

TRANSACTION表示事务

delimiter $$
DROP PROCEDURE IF EXISTS p1;
create PROCEDURE p1( -- 创建存储过程
OUT p_return_code tinyint -- out类型参数,用于返回值
)
BEGIN
DECLARE exit handler for sqlexception -- 捕捉错误,如果是sql错误就执行里面的
BEGIN
-- ERROR
set p_return_code = 1; -- 返回值1,说明sql错误
rollback; -- 回滚数据
END; DECLARE exit handler for sqlwarning -- 捕捉错误,如果是sql警告就执行里面的
BEGIN
-- WARNING
set p_return_code = 2; -- 返回值2,说明出现sql警告
rollback; -- 回滚数据
END; START TRANSACTION; -- 开始事务
-- 执行sql语句
UPDATE usr SET zij = zij - 20 WHERE yhm = '张三';
UPDATE usr2 SET zij = zij + 20 WHERE yhm = '李四';
COMMIT; -- 提交 -- SUCCESS
set p_return_code = 0; -- 返回0说明成功 END $$
delimiter ;

执行存储过程,执行事务

CALL p1(@u); -- 执行存储过程。传参接收返回值
SELECT @u; -- 查看返回值

可以看到返回1,说明sql错误,事务里的sql语句一旦有出现错误,将进行所有数据回滚,也就是无论成功的还是失败的语句都数据不变

pymysql模块,默认开启了事务(回滚),也就是说pymysql模块自动实现了事务(回滚)【重点】

还是上面的列子,将一个sql语句写错

#!/usr/bin/env python
#coding:utf-8 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
import pymysql #导入数据库模块 class khdHandler(tornado.web.RequestHandler):
def get(self): #连接数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='cshi',charset='utf8')
# 创建游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #获取存储过程(函数)的返回值
effect_row = cursor.execute("UPDATE usr SET zij = zij - 20 WHERE yhm = '张三'")
effect_row = cursor.execute("UPDATE usr2 SET zij = zij + 20 WHERE yhm = '李四'")
fhuizhi = cursor.fetchone()
print(fhuizhi) # 提交,不然无法保存新建或者修改的数据
conn.commit() # 关闭游标
cursor.close()
# 关闭连接
conn.close() self.write("欢迎访问") settings = { #html文件归类配置,设置一个字典
"template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称
"static_path":"statics", #键为static_path固定的,值为要存放js和css的文件夹名称
} #路由映射
application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法
(r"/khd", khdHandler),
],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里 if __name__ == "__main__":
#内部socket运行起来
application.listen(8002) #设置端口
tornado.ioloop.IOLoop.instance().start()

当执行时可以看到,提示第二个语句表名称是错误的,但是第一个应该是执行成功的

在这种情况下,可以看到pymysql模块自动实现了事务(回滚),数据库数据没有改变

第二百八十六节,MySQL数据库-MySQL事务操作(回滚)的更多相关文章

  1. 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承

    第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...

  2. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  3. 第二百八十五节,MySQL数据库-MySQL函数

    MySQL数据库-MySQL函数 1.MySQL内置函数 SELECT执行函数,后面跟要执行的函数 CHAR_LENGTH(str)函数:返回字符串的字符长度 -- CHAR_LENGTH(str)函 ...

  4. 第二百八十四节,MySQL数据库-MySQL触发器

    MySQL数据库-MySQL触发器 对某个表进行[增/删/改]操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行[增/删/改]前后的行为. 1.创建触发器基本语法 ...

  5. 第二百七十六节,MySQL数据库,【显示、创建、选定、删除数据库】,【用户管理、对用户增删改查以及授权】

    MySQL数据库,[显示.创建.选定.删除数据库],[用户管理.对用户增删改查以及授权] 1.显示数据库 SHOW DATABASES;显示数据库 SHOW DATABASES; mysql - 用户 ...

  6. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  7. 记录一次Spring boot 搭建框架连接Mysql数据库注解事务不回滚的故障

    搭建了一个新框架,使用了spring boot 替换以简化原来繁杂的spring配置,使用Spring注解管理事务,持久层使用mybatis. 连接mysql数据库完成项目的过程中发现不支持事务,因为 ...

  8. 第二百二十六节,jQuery EasyUI,Tree(树)组件

    jQuery EasyUI,Tree(树)组件 本节课重点了解 EasyUI 中 Tree(树)组件的使用方法,这个组件依赖于 Draggable(拖 动)和 Droppable(放置)组件. 一.加 ...

  9. 第二百三十六节,Bootstrap辅组类和响应式工具

    Bootstrap辅组类和响应式工具 学习要点: 1.辅组类 2.响应式工具 本节课我们主要学习一下 Bootstrap 的辅组类和响应式工具,辅助类提供了一组类来辅 组页面设计,而响应式工具则利用媒 ...

随机推荐

  1. nginx实战六

    Nginx错误日志 https://coding.net/u/aminglinux/p/nginx/git/blob/master/log/error.md Nginx错误日志平时不用太关注,但是一旦 ...

  2. Android图片处理:识别图像方向并显示

    在Android中使用ImageView显示图片的时候发现图片显示不正.方向偏了或者倒过来了. 解决问题非常自然想到的分两步走: 1.自己主动识别图像方向,计算旋转角度. 2.对图像进行旋转并显示. ...

  3. Linux安装mysql——源码安装

    1.假设已经有mysql-5.5.10.tar.gz以及cmake-2.8.4.tar.gz两个源文件 (1)先安装cmake(mysql5.5以后是通过cmake来编译的) [root@ rhel5 ...

  4. Spring Cloud构建微服务架构(四)分布式配置中心

    Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持.配置服务器为各应用的所有环境提供了一个中心化的外部配置.它实现了对服务端和客户端对Spring Environm ...

  5. [svc]免费证书认证

    1.申请免费域名(12个月) freenom.com 2.申请免费证书(3个月) git clone https://github.com/letsencrypt/letsencrypt cd let ...

  6. 【Linux】 无密码SCP在Crontab中失效的解决办法

    一.缘由: 之前由于服务器只能密钥登陆,并限制root账户登陆,故用SSH打通了所有服务器,实现了公钥转发scp免输密码等,极大方便了服务器的管理. 最近有个需求,是做数据的异地备份.最简单的用scp ...

  7. winform TreeView 节点选择

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } string tag = "Tru ...

  8. 一些有用的Sql语句

    1.插入数据后,返回插入的Id ')

  9. spark-streaming问题集锦

    报错: // :: ERROR Utils: Exception encountered py4j.Py4JException: Cannot obtain a new communication c ...

  10. spring容器的配置和springmvc的配置

    spring容器的配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...