第二百八十六节,MySQL数据库-MySQL事务操作(回滚)
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事务操作(回滚)的更多相关文章
- 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承
第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...
- 第一百二十六节,JavaScript,XPath操作xml节点
第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...
- 第二百八十五节,MySQL数据库-MySQL函数
MySQL数据库-MySQL函数 1.MySQL内置函数 SELECT执行函数,后面跟要执行的函数 CHAR_LENGTH(str)函数:返回字符串的字符长度 -- CHAR_LENGTH(str)函 ...
- 第二百八十四节,MySQL数据库-MySQL触发器
MySQL数据库-MySQL触发器 对某个表进行[增/删/改]操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行[增/删/改]前后的行为. 1.创建触发器基本语法 ...
- 第二百七十六节,MySQL数据库,【显示、创建、选定、删除数据库】,【用户管理、对用户增删改查以及授权】
MySQL数据库,[显示.创建.选定.删除数据库],[用户管理.对用户增删改查以及授权] 1.显示数据库 SHOW DATABASES;显示数据库 SHOW DATABASES; mysql - 用户 ...
- 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库
MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...
- 记录一次Spring boot 搭建框架连接Mysql数据库注解事务不回滚的故障
搭建了一个新框架,使用了spring boot 替换以简化原来繁杂的spring配置,使用Spring注解管理事务,持久层使用mybatis. 连接mysql数据库完成项目的过程中发现不支持事务,因为 ...
- 第二百二十六节,jQuery EasyUI,Tree(树)组件
jQuery EasyUI,Tree(树)组件 本节课重点了解 EasyUI 中 Tree(树)组件的使用方法,这个组件依赖于 Draggable(拖 动)和 Droppable(放置)组件. 一.加 ...
- 第二百三十六节,Bootstrap辅组类和响应式工具
Bootstrap辅组类和响应式工具 学习要点: 1.辅组类 2.响应式工具 本节课我们主要学习一下 Bootstrap 的辅组类和响应式工具,辅助类提供了一组类来辅 组页面设计,而响应式工具则利用媒 ...
随机推荐
- Python 字典 keys() 方法
描述 Python 字典 keys() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典中的所有的键. 语法 keys() 方法语法: D.keys() 参数 无. 返回值 ...
- elk中文教程
https://kibana.logstash.es/content/elasticsearch/monitor/logging.html ELK 实战之Elasticsearch ELK 地址:ht ...
- nginx+php-fpm配置后页面显示空白的解决方法(yum形式的安装)
OS: Ubuntu 15.04 由于nginx与php-fpm之间的一个小bug,会导致这样的现象: 网站中的静态页面 *.html 都能正常访问,而 *.php 文件虽然会返回200状态码, 但实 ...
- java线程高并发编程
java线程具体解释及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了.看看百度百科对他的评价,一点也不为过: 假设IT的历史 ...
- TCP数据流
1. 引言 如果按照分组数量计算,约有一半的TCP报文段包含成块数据(如FTP.电子邮件等),另一半则包含交互数据(如telnet和rlogin).如果按照字节计算,则成块数据与交互数据的比例约为90 ...
- 改善C#程序的建议9:使用Task代替ThreadPool和Thread
一:Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: 1: ThreadPool不支持线程的取消.完成.失败通知等交互 ...
- 【Android】10.3 网格视图(GridView)
分类:C#.Android.VS2015: 创建日期:2016-02-19 一.简介 网格视图(GridView)是在GridLayout的基础上添加了滚动功能的视图,即:GridView用于在可滚动 ...
- C# RSA数据加密
第一步产生密钥类 CreateKey using System; using System.Collections.Generic; using System.Linq; using System.T ...
- assert用法总结
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int ...
- 每日英语:How to Be a Better Conversationalist
Jason Swett still cringes when he remembers the party in Atlanta 10 years ago, where, drink in hand, ...