mysql.connector 事务总结
mysql.connector事务总结:
connection.autocommit = 0 (默认值)
事务处理
使用 connection.commit()方法
#!/usr/bin/env python
# -*- coding:utf-8 -*- '''mysql.connector事务总结: connection.autocommit = 0 (默认值)
事务处理
使用 connection.commit()方法 分析:
智能commit状态:
connection.autocommit = 0 (默认值)
默认不提交
事务处理
可以使用 connection.commit()方法来进行提交 自动commit状态:
connection.autocommit = 0
这样,在任何DML操作时,都会自动提交
事务处理
connection.execute("BEGIN;")
connection.commit()
如果不使用事务, 批量添加数据相对缓慢 两种方式, 事务耗时差别不大
自动commit的速度受网络传输影响大 比较数据:
192.168.1.107, count=100
默认commit事务耗时: 0.152
自动commit, cursor.execute("COMMIT;")耗时: 0.139
自动commit2, connection.commit()耗时: 0.143
自动commit,非事务耗时: 0.397 192.168.1.107, count=1000
默认commit事务耗时: 1.365
自动commit, cursor.execute("COMMIT;")耗时: 1.389
自动commit2, connection.commit()耗时: 1.291
自动commit,非事务耗时: 3.871 192.168.6.226, count=100
默认commit事务耗时: 0.178
自动commit, cursor.execute("COMMIT;")耗时: 0.183
自动commit2, connection.commit()耗时: 0.192
自动commit,非事务耗时: 1.965 ''' import sys
import time class Elapse_time(object):
'''耗时统计工具'''
def __init__(self, prompt=''):
self.prompt = prompt
self.start = time.time() def __del__(self):
print('%s耗时: %.3f' % (self.prompt, time.time() - self.start))
CElapseTime = Elapse_time import mysql.connector # -------------------------------------------------------------------------------
# 测试
# db_parameters = {'host': '192.168.1.107',
'database': 'test',
'charset': 'utf8'}
db_parameters1 = {'host': '192.168.6.226',
'database': 'test',
'charset': 'utf8'} def prepare(isolation_level = ''):
connection = mysql.connector.MySQLConnection(**db_parameters)
cursor = connection.cursor()
cursor.execute("create table IF NOT EXISTS people (num int, age int)")
cursor.execute('delete from people')
connection.commit()
return connection, connection.cursor() def db_insert_values(cursor, count):
num = 1
age = 2 * num while num <= count:
cursor.execute("insert into people values (%s, %s)", (num, age))
num += 1
age = 2 * num def study_case1_default_commit_manual(count):
connection, cursor = prepare() elapse_time = Elapse_time(' 默认commit事务')
db_insert_values(cursor, count)
connection.commit() cursor.execute("select count(*) from people")
print (cursor.fetchone()) def study_case2_autocommit_transaction(count):
connection, cursor = prepare(isolation_level = None)
connection.autocommit = 1 elapse_time = Elapse_time(' 自动commit, cursor.execute("COMMIT;")')
cursor.execute("BEGIN;") # 关键点
db_insert_values(cursor, count)
cursor.execute("COMMIT;") #关键点 cursor.execute("select count(*) from people;")
print (cursor.fetchone()) def study_case3_autocommit_transaction2(count):
connection, cursor = prepare(isolation_level = None)
connection.autocommit = 1 elapse_time = Elapse_time(' 自动commit2, connection.commit()')
cursor.execute("BEGIN;") # 关键点
db_insert_values(cursor, count)
connection.commit() cursor.execute("select count(*) from people;")
print (cursor.fetchone()) def study_case4_autocommit_no_transaction(count):
connection, cursor = prepare(isolation_level = None)
connection.autocommit = 1 elapse_time = Elapse_time(' 自动commit,非事务')
db_insert_values(cursor, count) cursor.execute("select count(*) from people;")
print (cursor.fetchone()) def main(config):
output = []
db = mysql.connector.Connect(**config)
cursor = db.cursor() # Drop table if exists, and create it new
stmt_drop = "DROP TABLE IF EXISTS names"
cursor.execute(stmt_drop) stmt_create = """
CREATE TABLE names (
id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(30) DEFAULT '' NOT NULL,
cnt TINYINT UNSIGNED DEFAULT 0,
PRIMARY KEY (id)
) ENGINE=InnoDB"""
cursor.execute(stmt_create) warnings = cursor.fetchwarnings()
if warnings:
ids = [ i for l,i,m in warnings]
output.append("Oh oh.. we got warnings..")
if 1266 in ids:
output.append("""
Table was created as MYISAM, no transaction support. Bailing out, no use to continue. Make sure InnoDB is available!
""")
db.close()
return # Insert 3 records
output.append("Inserting data")
names = ( ('Geert',), ('Jan',), ('Michel',) )
stmt_insert = "INSERT INTO names (name) VALUES (%s)"
cursor.executemany(stmt_insert, names) # Roll back!!!!
output.append("Rolling back transaction")
db.rollback() # There should be no data!
stmt_select = "SELECT id, name FROM names ORDER BY id"
cursor.execute(stmt_select)
rows = None
try:
rows = cursor.fetchall()
except mysql.connector.InterfaceError as e:
raise if rows == []:
output.append("No data, all is fine.")
else:
output.append("Something is wrong, we have data although we rolled back!")
output.append(rows)
cursor.close()
db.close()
return output # Do the insert again.
cursor.executemany(stmt_insert, names) # Data should be already there
cursor.execute(stmt_select)
output.append("Data before commit:")
for row in cursor.fetchall():
output.append("%d | %s" % (row[0], row[1])) # Do a commit
db.commit() cursor.execute(stmt_select)
output.append("Data after commit:")
for row in cursor.fetchall():
output.append("%d | %s" % (row[0], row[1])) # Cleaning up, dropping the table again
cursor.execute(stmt_drop) cursor.close()
db.close()
return output if __name__ == '__main__':
#out = main(db_parameters)
#print('\n'.join(out)) count = 1000
prepare()
for i in range(1):
study_case1_default_commit_manual(count)
study_case2_autocommit_transaction(count)
study_case3_autocommit_transaction2(count)
study_case4_autocommit_no_transaction(count)
mysql.connector 事务总结的更多相关文章
- mysql 分布式事务
php + mysql 分布式事务 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicit ...
- Mybatis异常处理之MySQL Connector Java] will not be managed by Spring
很长时间没写后台代码有点生疏了,这不今天又出点小插曲,写个文章记录下. 由于要上传点数据到后台,顺手整了个mybatis+springmvc.在保存数据时出现了异常. Creating a new S ...
- MySQL Connector/Python 接口 (一)
这里仅介绍 MySQL 官方开发的 Python 接口,参见这里: https://dev.mysql.com/doc/connector-python/en/ Chapter 1 Introduct ...
- MySQL 数据库事务与复制
好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...
- 创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL
创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL 用惯.NET的研发人员都习惯性地使用SQLServer作为数据库.然而.NET Core ...
- vc++2013中使用MySQL connector/C++ 1.1.4静态链接报错
包含头文件 #include <mysql_connection.h> #include <mysql_driver.h> #include <cppconn/state ...
- Using MySQL Connector .NET 6.6.4 with Entity Framework 5
I had been waiting for the latest MySQL connector for .NET to come out so I can move on to the new a ...
- [转]MySQL Connector/C++(一)
http://www.cnblogs.com/dvwei/archive/2013/04/18/3029464.html#undefined#undefined MySQL Connector/C++ ...
- mysql.connector操作mysql的blob值
This tutorial shows you how to work with MySQL BLOB data in Python, with examples of updating and re ...
随机推荐
- ionic + cordova开发APP遇到的一些坑
ionic1时期接触了这套体系,做了一个APP之后就放置了,最近又要开发一个APP,但时间不足以让我重头了解typescripts,于是又把之前做过的东西翻了出来,一边做一边掉坑里,爬上来再掉坑里,所 ...
- C# Socket通讯 本机多网卡,指定网卡通讯
IPAddress ip = IPAddress.Parse("192.168.0.188"); IPAddress IPLocal = IPAddress.Parse(" ...
- .Net并行计算支持嵌套事务的方法
问题背景 一年前,我们开始利用.Net 4.0的TPL(Task Parallel Library)并行计算技术对复杂计算的功能节点进行性能优化,这些复杂计算往往会包含大量对数据库的操作.在应用TPL ...
- 装X数学:高雅的数学表示
采用高雅的数学描述 转自于:研究生之路怎么走? 高雅的数学描述会提高你论文的等级和加强评审人对你基础功底的认可.例如泛函分析.集合.测度.度量空间和拓扑空间.现代代数.微分几何等数学方面的 ...
- VTK嵌入MFC同步显示
使用VTK嵌入MFC,实现四视图更新,机制和细节参考原文. 原文链接:http://blog.csdn.net/www_doling_net/article/details/8939115 原文代码: ...
- 工作中总结的经验之git篇
不要以为你会git,你要知道,git不是只有commit和push 由于系统分析与设计的期末Project需要团队合作开发,因此在这里想谈谈GitHub团队项目合作开发的流程: 项目创建 项目负责人在 ...
- js遍历对象属性
对象虽然与数组一样,都是数据的集合. 因为对象中的数据是处于无序状态,不能像数组那样,使用下标来遍历对象的所有属性. 如果要遍历对象属性,就必须要使用for in 语句. var a={ A1=180 ...
- 虚拟DOM介绍
[转自]:https://www.jianshu.com/p/616999666920 为什么需要虚拟DOM 先介绍浏览器加载一个HTML文件需要做哪些事,帮助我们理解为什么我们需要虚拟DOM.web ...
- shell常用语法
for.if条件: https://blog.51cto.com/qiufengsong/1252889 一.for循环: );do echo $i done ###第一行:seq是指1到10,第二行 ...
- python-flask-2 安装及设定 flask
https://linoxide.com/linux-how-to/install-flask-python-ubuntu/ 1. prerequisites > create a new us ...