【mysql】MySQLdb中的事务处理
MySQL数据库有一个自动提交事务的概念,autocommit。含义是,如果开启autocommit, 则每一个语句执行后会自动提交。即一个语句视为一个事务。
在python使用的MySQLdb中,默认是不开启autocommit的。所以,只有在显示commit后,数据库操作才会真正提交。或者在rollback()后,回滚到上一次commit的状态。
例:
#!/bin/env python
#coding=utf-8 import MySQLdb class MYSQL(object):
def __init__(self):
self.db = MySQLdb.connect("localhost","root","12345678","TESTTABLE",charset='utf8')
self.cursor = self.db.cursor() def test(self):
try:
sql = "insert into test_distinct(name, type) values('t3','')"
self.cursor.execute(sql)
sql = "update test_distinct set type='' where name='t3'"
#raise #打开用于测试异常
self.cursor.execute(sql)
except:
self.db.rollback() #出现异常,不会提交任何数据变化
else:
self.db.commit() #正常处理,提交数据变化(如果没有这一句,也是不会提交任何变化的) if __name__ == "__main__":
obj = MYSQL()
obj.test()
场景:在两次插入语句直接有一个查询语句
#!/bin/env python
#coding=utf-8 import MySQLdb class MYSQL(object):
def __init__(self):
self.db = MySQLdb.connect("localhost","root","","TESTTABLE",charset='utf8')
self.cursor = self.db.cursor() def test(self):
try:
name = 't5'
#insert
sql = "insert into test_distinct(name, type) values('%s','1')" % name
self.cursor.execute(sql)
#search
sql = "select * from test_distinct where name = '%s'" % name #查询新插入的数据
self.cursor.execute(sql)
res = self.cursor.fetchone()
print res
#insert
sql = "update test_distinct set type='2' where name='%s'" % name
raise #引起异常
self.cursor.execute(sql)
except:
self.db.rollback()
else:
self.db.commit() if __name__ == "__main__":
obj = MYSQL()
obj.test()
结果:
可以正确查询到新插入的数据,并且数据成功回滚,没有写入数据。
结论:虽然没有commit时,数据库不会真正变化,但是会有一个临时变化的版本,供我们查询还未真正加入的数据。
注意:上面的结果是建立在mysql使用的存储引擎支持事务的基础上的。如果用MyISAM,则即使像上面一样写代码,也会默认一句话就提交一次的,因为MyISAM不支持事务。
【mysql】MySQLdb中的事务处理的更多相关文章
- MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
- 使用redis 中的事务处理实现商品秒杀
redis中的事务处理: redis中的事物事物处理是指能够批量的执行一组命令(当事务开始执行时,事务中的命令能够按照按照规定好的顺序执行而不会被插队或打断): 与mysql事务的区别在于:mysql ...
- PDO中的事务处理
基本原理和步骤其实都是一样的(可参看上一篇“MySQL的事务处理”),PDO中的事务处理就是调用PDO对象的三个方法: 开启事务:beginTransaction 回滚操作:rollBack 执行操作 ...
- Mysql数据库中InnoDB和MyISAM的差别
Mysql数据库中InnoDB和MyISAM的差别 InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理, ...
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
- Python使用Mysql过程中一些错误
Python使用Mysql过程中一些错误 ssh登录远程服务器 ssh ubuntu@xxx.xxx.xx.xx 第一:ubuntu终端中登录Mysql mysql -uroot -p 然后输入密码即 ...
- python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图
python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...
- 为什么在MySQL数据库中无法创建外键?(MyISAM和InnoDB详解)
问题描述:为什么在MySQL数据库中不能创建外键,尝试了很多次,既没有报错,也没有显示创建成功,真实奇了怪,这是为什么呢? 问题解决:通过查找资料,每次在MySQL数据库中创建表时默认的情况是这样的: ...
- MySQL数据库中delimiter的作用概述
以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大,到底是不是这样的呢?以下的文章将会给你相关的知识,望你会有所收获. 其实就是告 ...
随机推荐
- 教你如何用Meterpreter渗透Win系统
在这篇文章中,我们将跟大家介绍如何使用Meterpreter来收集目标Windows系统中的信息,获取用户凭证,创建我们自己的账号,启用远程桌面,进行屏幕截图,以及获取用户键盘记录等等. 相关Payl ...
- 转:scrollWidth,clientWidth,offsetWidth的区别
scrollWidth:对象的实际内容的宽度,不包边线宽度,会随对象中内容超过可视区后而变大. clientWidth:对象内容的可视区的宽度,不包滚动条等边线,会随对象显示大小的变化而改变. off ...
- DataSet in Machine Learning
一.UCI Wine dataset:https://archive.ics.uci.edu/ml/datasets/Wine,包含178个样本,每个样本包含13个与酒的化学特性的特征,标签有1,2, ...
- 深入理解 BFC
W3C 规范中 BFC的定义: 浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不 ...
- mysql用户权限分配专栏
00x1创建新用户 通过root用户登录之后创建 创建新用户,用户名为testuser,密码为123456 : 1 grant all privileges on *.* to testuser@lo ...
- 使用paramiko远程执行命令、下发文件
写部署脚本时,难免涉及到一些远程执行命令或者传输文件. 之前一直使用sh库,调用sh.ssh远程执行一些命令,sh.scp传输文件,但是实际使用中还是比较麻烦的,光是模拟用户登陆这一点,还需要单独定义 ...
- 无线路由器的web漏洞
1.XSS漏洞 2.CSRF漏洞 这样的攻击方式具体可以由多种形式实现,除了建立欺诈服务器外,还可以使用超链接陷阱.所谓的超链接陷阱,就是指伪造一个可信的链接或者地址,但其实际地址中包含了修改无线路由 ...
- text-decoration和text-indent和text-shadow
text-decoration 属性规定添加到文本的修饰,规定划线的位置. <html> <head> <style type="text/css"& ...
- 交叉熵的数学原理及应用——pytorch中的CrossEntropyLoss()函数
分类问题中,交叉熵函数是比较常用也是比较基础的损失函数,原来就是了解,但一直搞不懂他是怎么来的?为什么交叉熵能够表征真实样本标签和预测概率之间的差值?趁着这次学习把这些概念系统学习了一下. 首先说起交 ...
- python顺序执行多个py文件
python顺序执行多个py文件 假如我要执行code目录下的python程序,假设该目录下有1.py,2.py,3.py,4.py四个文件,但是我想执行1.py,2.py,4.py,则可在该目录下创 ...