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. Spring boot设置启动监听端口

    一.通过配置 修改application.properties 在属性文件中添加server.port=8000 二.直接看代码: @Controller @EnableAutoConfigurati ...

  2. spring 多线程

    http://blog.csdn.net/chszs/article/details/8219189 一.ThreadPoolTaskExecutor ThreadPoolTaskExecutor的配 ...

  3. PHP通过__call实现简单的AOP(主事务后的其他操作)比如前置通知,后置通知

    /** * person class */ class Person { /** * person class -> function say */ public static function ...

  4. java Webservice(一)HttpClient使用(二)

    HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java.net 包中已经提供了 ...

  5. Java:几个正则式应用(检查汉字、日期、EMAIL、手机号码的合法性,替换字符串等)

    1. 检查输入是否为合法汉字 /** * 判断输入字符是否为有效汉字 * @param str 字符 * @return 是否合法汉字 */ public static boolean isValid ...

  6. express设置模板引擎

    app.set('views', path.join(__dirname,'views')); app.set('view engine', 'ejs');

  7. 李洪强漫谈iOS开发[C语言-054]-函数

    // //  main.c //  02 翻译数字的优化 // //  Created by vic fan on 2017/6/4. //  Copyright © 2017年 李洪强. All r ...

  8. Hadoop副本数配置

    一个文件,上传到hdfs上时指定的是几个副本就是几个.修改了副本数(dfs.replications),对已经上传了的文件也不会起作用.当然可以在上传文件的同时指定创建的副本数hadoop dfs - ...

  9. jQuery-File-Upload文件上传

    http://blueimp.github.io/jQuery-File-Upload/index.html

  10. PowerShell中进行文件读取,信息排序,分类计数。

    这是国外某大学QA的一道作业题,读取mainlog文件中的每一行信息,并获取有效的信息,也就是每条信息中第四个@后面的内容,然后进行分类与计数,要求是用Perl写,但我是用PowerShell完成的, ...