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 ...
随机推荐
- 安卓代码迁移:ActionBarActivity: cannot be resolved to a type
参考链接:http://stackoverflow.com/questions/18830736/actionbaractivity-cannot-be-resolved-to-a-type in e ...
- 腾讯模板引擎template
template.js是一款JavaScript模板引擎,用来渲染页面的. 原理:提前将Html代码放进编写模板 script id="tpl" type="text/ ...
- vue-router同路由地址切换无效解决
本来还想写的,一搜就有现成的,算了: http://blog.csdn.net/peng_guan/article/details/59702699
- PAT_A1111#Online Map
Source: PAT A1111 Online Map (30 分) Description: Input our current position and a destination, an on ...
- eas之网络互斥功能示手工控制
public void doMutexService() { IMutexServiceControl mutex = MutexServiceControlFactory.get ...
- 02-Linux命令基础-第02天(压缩包管理、服务器搭建与使用、vim)
01- 复习 /boot 目录 引导项 八种文件类型: 文件:- 目录:d 软链接:l 字符设备文件:c 块设备文件:b 管道:p 套接字:s 未知 cp –a 保持源文件属性(如时间属性 如果不 ...
- [SDFZOJ]1069:树上统计
神题...std丑的不行. 我们可以发现i->i+1的边被覆盖过i×(n-i)次. 因为以1->i为左端点,以i+1->n的为右端点,i->i+1都将被覆盖这么多次. 然后从1 ...
- 1.1、配置Python虚拟环境
安装虚拟环境 系统:CentOS 7.2 python版本:Python 2.7.5 1.虚拟环境介绍 虚拟环境是Python解释器的一个私有副本,在这个环境中你可以安装私有包,而且不会影响系统中安装 ...
- Easyphp让其他电脑访问
1.将httpd.conf中的Listen 127.0.0.1:80,修改为Listen 80. 2.重启
- ELK 聚合查询
在elasticsearch中es支持对存储文档进行复杂的统计.简称聚合. ES中的聚合被分为两大类. 1.Metrics, Metrics 是简单的对过滤出来的数据集进行avg,max等操作,是一个 ...