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 事务总结的更多相关文章

  1. mysql 分布式事务

    php + mysql 分布式事务 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicit ...

  2. Mybatis异常处理之MySQL Connector Java] will not be managed by Spring

    很长时间没写后台代码有点生疏了,这不今天又出点小插曲,写个文章记录下. 由于要上传点数据到后台,顺手整了个mybatis+springmvc.在保存数据时出现了异常. Creating a new S ...

  3. MySQL Connector/Python 接口 (一)

    这里仅介绍 MySQL 官方开发的 Python 接口,参见这里: https://dev.mysql.com/doc/connector-python/en/ Chapter 1 Introduct ...

  4. MySQL 数据库事务与复制

    好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...

  5. 创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL

    创建ASP.NET Core MVC应用程序(2)-利用MySQL Connector NET连接到MySQL 用惯.NET的研发人员都习惯性地使用SQLServer作为数据库.然而.NET Core ...

  6. vc++2013中使用MySQL connector/C++ 1.1.4静态链接报错

    包含头文件 #include <mysql_connection.h> #include <mysql_driver.h> #include <cppconn/state ...

  7. 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 ...

  8. [转]MySQL Connector/C++(一)

    http://www.cnblogs.com/dvwei/archive/2013/04/18/3029464.html#undefined#undefined MySQL Connector/C++ ...

  9. mysql.connector操作mysql的blob值

    This tutorial shows you how to work with MySQL BLOB data in Python, with examples of updating and re ...

随机推荐

  1. C语言笔记(二)

    注释 编译器会用空格代替代码中原来的注释,并先于预处理指令执行/*…*/ 这种形式的注释不能嵌套只要斜杠(/)和星号(*)之间没有空格,都会被当作注释的开始.例如这样:y = x/*p; \ 是一个接 ...

  2. C# 查找、结束进程 - 通过进程名精确、模糊查找、结束进程

    /// <summary> /// 根据“精确进程名”结束进程 /// </summary> /// <param name="strProcName" ...

  3. Metric Learning度量学习:**矩阵学习和图学习

    DML学习原文链接:http://blog.csdn.net/lzt1983/article/details/7884553 一篇metric learning(DML)的综述文章,对DML的意义.方 ...

  4. 【Hexo】deploy出错的解决方法

    .ERROR Deployer not found: git 执行npm install hexo-deployer-git --save .$ hexo d INFO Deploying: git ...

  5. 很实用的html meta标签实现页面跳转

    就算你是有很多年开发经验的web开发工程师,有着很多web开发经验,对于先进的web开发技术有着很深刻的研究,然而你却忽略了那些最最基础的东西!现在我来问你,你是否对html所有的标签都能熟练的使用呢 ...

  6. antd #upload

    import React from 'react' import {Upload, Icon, message,Button } from 'antd' import './index.scss'; ...

  7. Js正则匹配处理时间

    <html> <body> <script type="text/javascript"> //将long 型 转换为 日期格式 年-月-日 h ...

  8. 【转载】java中的反射

    主要介绍以下几方面内容 理解 Class 类 理解 Java 的类加载机制 学会使用 ClassLoader 进行类加载 理解反射的机制 掌握 Constructor.Method.Field 类的用 ...

  9. LeetCode -- 1038. Binary Search Tree to Greater Sum Tree

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  10. html第八节课

    导航 1.首先在<head>里面引用一个JQUERY的文件以用来制作鼠标点击动画效果(从网站上下载即可) 1 <script language="javascript&qu ...