pythonsqlite事务_python sqlite3 的事务控制

Python sqlite3 的事务控制

官方文档的描述:

Controlling Transactions

By default, the sqlite3 module opens transactions implicitly before a Data Modification Language (DML) statement (i.e. INSERT/UPDATE/DELETE/REPLACE), and commits transactions implicitly before a non-DML, non-query statement (i. e. anything other than SELECT or the aforementioned).

So if you are within a transaction and issue a command like CREATE TABLE ..., VACUUM, PRAGMA, thesqlite3 module will commit implicitly before executing that command. There are two reasons for doing that. The first is that some of these commands don’t work within transactions. The other reason is that pysqlite needs to keep track of the transaction state (if a transaction is active or not).

You can control which kind of BEGIN statements sqlite3 implicitly executes (or none at all) via the isolation_level parameter to the connect() call, or via the isolation_level property of connections.

(译文:你能控制sqlite3默认执行的BEGIN语句类型(或者什么类型都不),这是通过设置connect()函数的isolation_level 参数,或connection对象的isolation_level属性实现的。)

If you want autocommit mode, then set isolation_level to None.

(译文:如果想使用自动提交模式,设置isolation_level为None。)

Otherwise leave it at its default, which will result in a plain “BEGIN” statement, or set it to one of SQLite’s supported isolation levels: “DEFERRED”, “IMMEDIATE” or “EXCLUSIVE”.

(译文:不设置isolation_level(使用默认)将会执行朴素的BEGIN语句(即下文sql语句图中,BEGIN或BEGINTRANSACTION),或者设置为“DEFERRED”, “IMMEDIATE” 或“EXCLUSIVE”(即BEGIN DEFERRED/IMMEDIATE/EXCLUSIVETRANSACTION)。)

isolation_level控制的是什么

从上文我们看到,这个变量与BEGIN语句的模式有关,可选值为 “None“,“空“(不设置),“DEFERRED”, “IMMEDIATE” ,“EXCLUSIVE”

设置为None即自动提交,即每次写数据库都提交。

官网文档前两段写的是智能提交,在某些语句自动开启事务,执行某些语句前自动commit。

后边四个是什么?

注:原文中begin-stmt应该是begin-statement的缩写

这是描述sql语句语法的图,即:

BEGIN TRANSACTION

BEGIN

BEGIN DEFERRED TRANSACTION

BEGIN DEFERRED

...

情况就明了了,isolation_level决定开启事务时使用的是BEGIN TRANSACTION, BEGIN DEFERRED TRANSACTION, BEGIN IMMEDIATE TRANSACTION, BEGIN EXCLUSIVE TRANSACTION中的那种。

我是这么认为的,immediate 是begin语句处获得PENDING锁,deferred是获取RESERVED锁,update,delete,insert等写语句出现时才获得PENDING锁,exclusive是获取EXCLUSIVE排他锁

isolation_level为None是开启自动commit功能,非None是设置BEGIN的类型,开启智能commit。

我理解为:1.BEGIN是自动开启的 2.设为None每次写数据库都会自动commit 3.设为其他会在某些语句前自动commit,其他地方想立即commit要手动执行。

例子来了!

智能commit

import sqlite3

con = sqlite3.connect(":memory:")

cur = con.cursor()

cur.execute("create table people (num, age)")

num = 1

age = 2 * num

while num <= 1000000:

cur.execute("insert into people values (?, ?)", (num, age))

num += 1

age = 2 * num

cur.execute("select count(*) from people")

print cur.fetchone()

保存为test.py执行之

# time python test.py

(1000000,)

real    0m6.537s

user    0m6.440s

sys     0m0.086s

自动commit

import sqlite3

con = sqlite3.connect(":memory:",isolation_level=None)

cur = con.cursor()

cur.execute("create table people (num, age)")

num = 1

age = 2 * num

while num <= 1000000:

cur.execute("insert into people values (?, ?)", (num, age))

num += 1

age = 2 * num

cur.execute("select count(*) from people")

print cur.fetchone()

执行之

# time python test.py

(1000000,)

real    0m10.693s

user    0m10.569s

sys     0m0.099s

智能commit用时6秒,自动commit用时10秒 (例子是写内存,如果写文件速度会更慢,建议改为写100条数据)

智能commit

优点:速度快,单进程情况下运行良好

缺点:多个控制流并发操作数据库时,这边写完了,另一边可能读不出来

克服缺点:每次写完数据,手动执行commit

自动commit

优点:每次写数据库都能保证确实写入了,防止并发操作数据库时出现逻辑问题

缺点:太慢了!!!

克服缺点:批量操作前手动BEGIN TRANSACTION,操作后手动COMMIC

克服缺点的例子

智能commit时实现即时commit

# coding:utf-8

import sqlite3

con = sqlite3.connect(":memory:")

cur = con.cursor()

cur.execute("create table people (num, age)")

num = 1

age = 2 * num

while num <= 1000000:

cur.execute("insert into people values (?, ?)", (num, age))

con.commit() # 关键在这里

num += 1

age = 2 * num

cur.execute("select count(*) from people")

print cur.fetchone()

time python test.py

(1000000,)

real    0m20.797s

user    0m20.611s

sys     0m0.156s

自动commit时阻止即时commit

# coding:utf-8

import sqlite3

con = sqlite3.connect(":memory:",isolation_level=None)

cur = con.cursor()

cur.execute("create table people (num, age)")

num = 1

age = 2 * num

cur.execute("BEGIN TRANSACTION") # 关键点

while num <= 1000000:

cur.execute("insert into people values (?, ?)", (num, age))

num += 1

age = 2 * num

cur.execute("COMMIT") #关键点

cur.execute("select count(*) from people")

print cur.fetchone()

# time python test.py

(1000000,)

real    0m6.649s

user    0m6.555s

sys     0m0.076s

这次,智能commit用时20秒(性能下降很多),自动commit用时6秒 ,完全反过来了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树遍历的超简单方法(详细、简单)

二叉树遍历的超简单方法 参考链接&#xff1a;https://wenku.baidu.com/view/e5463e4203d8ce2f0166230a.html 已修改部分问题。 三种常见二叉树的遍历&#xff1a; 先序遍历的递归算法定义&#xff08;简称根左右&#xff09; 若二叉树非空&#xff0c;则依次执行如下操作&a…

怎么看我装的sql能不能用_深入浅出sql优化(三)之单表索引优化

大家好&#xff0c;我是闲水&#xff0c;每天更新java最新最热技术&#xff0c;对java感兴趣的朋友记得关注一下哦。注意 &#xff1a;这是SQL性能优化第三章&#xff0c;点击关注查看前置内容。上篇文章我们主要了解了索引优化的标尺"Explain"怎么用&#xff0c;这一…

java类加载顺序(spring容器下)

执行顺序&#xff1a;父类静态块–>子类静态块–>父类非静态块–>父类构造方法–>子类非静态块–>子类构造方法–>自动装载的方法 子类和父类均加上Service注解&#xff0c;将其交给spring容器管理。 父类&#xff1a; Service public class Father {publ…

python 绘图 hist bin参数_Python-hist,distplot bin宽度不一致问题的解决方案

python的hist有一个bug&#xff0c;之前一直没有解决。绘制直方图的时候&#xff0c;往往出现两组数据由于分布不一样&#xff0c;&#xff0c;导致出来的图片中&#xff0c;虽然是一样数目的bins&#xff0c;但是bin的宽窄不同。而我想得到的是&#xff0c;&#xff0c;虽然数…

Nginx反向代理的使用

1. 常用服务器比较 apache: 功能完善&#xff0c;历史悠久&#xff0c;模块支持非常丰富&#xff0c;属于重量级产品&#xff0c;比较耗费内存。缺点:处理每一个php比较费资源&#xff0c;导致如果高并发时会耗费服务器资源无法处理更多请求。 lighttpd: 内存开销低&#xff0…

python继承语法_python中继承父类的例子(python3的语法)

#codingutf8class Cup:#构造函数&#xff0c;初始化属性值def __init__(self,capacity,color):self.capacitycapacityself.colorcolordef retain_water(self):print("杯子颜色&#xff1a;"self.color"&#xff0c;杯子容量&#xff1a;"self.capacity&quo…

Rabbit发送消息,消费者消费异常

Rabbit发送消息&#xff0c;消费者消费异常 背景&#xff1a; 在步骤1下创建订单&#xff0c;步骤2下提交消息 Transactionalpublic void tradeHandler(Map map) { // 1.生成统一订单 var unifyOrder orderService.create(orderService.getUnifyOrderDTO(fee, alipayOrder));…

jwt token 太长_理解 JWT 鉴权的应用场景及使用建议

JWT 介绍JSON Web Token(JWT)是一个开放式标准(RFC 7519)&#xff0c;它定义了一种紧凑(Compact)且自包含(Self-contained)的方式&#xff0c;用于在各方之间以JSON对象安全传输信息。这些信息可以通过数字签名进行验证和信任。可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥…

如何使用explain进行SQL语句调优

参考&#xff1a;https://mp.weixin.qq.com/s/kYcrHtE82-sOqNOp_qM4Ig

microsoft vbscript编译器错误怎么解决_win7系统ie应用程序错误怎么办 ie应用程序错误解决方法【详解】...

windows系统自带的ie浏览器很少用户会去使用到&#xff0c;它运行起来比其他的浏览器要慢很多&#xff0c;而且经常会出现各种各样的问题&#xff0c;最近有位win7系统用户&#xff0c;在使用ie浏览器的时候&#xff0c;发生了应用程序错误的情况&#xff0c;那么win7系统ie应用…

简述python爬虫_python爬虫入门篇了解

1. 爬虫分类&#xff1a;1.1 通用爬虫&#xff1a;例如搜索引擎&#xff1a;无差别的收集数据&#xff1b;提取存储关键字&#xff1b;构建索引库&#xff1b;给用户提供搜索接口。1.2 聚焦爬虫&#xff1a;有针对性的编写特定领域数据的爬取程序。2. Robots协议&#xff1a;指…

修改固态硬盘的物理序列号_买固态怕踩坑?收下这些软件,轻松鉴别好坏

再有半个月&#xff0c;就迎接年中的促销旺季。不少朋友都希望趁着各种优惠、跳楼价&#xff0c;组一台梦想机、升级一下自己的电脑。说到体验升级&#xff0c;相信就算是DIY新手和硬件小白都知道&#xff0c;要想电脑快&#xff0c;必须选固态。但是固态参数多&#xff0c;又是…

python乘法表代码注释_Python统计python文件中代码,注释及空白对应的行数示例【测试可用】...

本文实例讲述了Python实现统计python文件中代码,注释及空白对应的行数。分享给大家供大家参考&#xff0c;具体如下&#xff1a;其实代码和空白行很好统计&#xff0c;难点是注释行python中的注释分为以#开头的单行注释或者以开头以结尾 或以"""开头以"&qu…

32位python和64位python区别_python32位和64位有什么区别

python32位和64位有什么区别&#xff1f;64位能够用更大的内存空间&#xff0c;64位可以在64位的系统下运行&#xff0c;但是不能在32位系统下运行。32位能够在32位和64位上运行&#xff0c;考虑到兼容性&#xff0c;建议使用32位的python。如何查看python是32位还是64位可使用…

《常用控制电路》学习笔记——数控锁相环调速电路

序言 今天开始我将把自己学习《常用控制电路》的一些内容发到互联网上&#xff0c;希望能和大家交流学习。 这本书主要介绍了一系列控制电路的经典案例&#xff0c;进行了电路和代码的设计&#xff0c;我将把这本书中学习到的内容和学习的过程尽量准确的分享出来与大家交流&…

《常用控制电路》学习笔记——数字控制直流电动机调速电路

书中该节讲述的电路通过ADC芯片将电位器的阻值转换为电压量&#xff0c;然后使用单片机输出PWM进行电路控制。本电路也可扩展应用至需要模拟量输入与输出的场合。 目录 一、系统设计思路 二、各模块电路分析 2.1电路构成 2.2工作状态分析 三、程序分析 3.1 变量定义 3.…

《常用控制电路》学习笔记——数控直流恒流源电路

书中该项目内容设计了一个从交流220V市电作为供电电源的恒流源电路&#xff0c;并且此电路可由加减计数器74LS193控制输出的电流大小。 目录 一、系统方案 二、各模块电路分析 整流滤波及稳压电路 数字量控制电路 数模转换电路 数控恒流源产生电路 三、电路仿真结果 四…

图像太宽无法输出请裁剪图像或降低分辨率然后重试_真·无监督!延世大学提出图像到图像无监督模型,实验结果超SOTA...

作者 | 蒋宝尚编辑 | 丛 末图像翻译目的是用模型将源域图像转换到目标域图像&#xff0c;通常涉及标签图到场景图的转换、图像风格、人脸的属性变换、标签图到场景图的转换。图像翻译任务自生成对抗网络提出就得到了快速发展&#xff0c;例如经典的pix2pix、CycleGAN、StarGAN。…

python图像文件压缩_python实现图片压缩代码实例

前言项目中大量用到图片加载&#xff0c;由于图片太大&#xff0c;加载速度很慢&#xff0c;因此需要对文件进行统一压缩一&#xff1a;导入包from PIL import Imageimport os二&#xff1a;获取图片文件的大小def get_size(file):# 获取文件大小:KBsize os.path.getsize(file…

php serialize和json_encode哪个更快_世界 10 大编程语言,Java 不是第一,PHP 才第五...

来源&#xff1a;toutiao.com/a6764554659349676557/如果你是软件开发领域的新手&#xff0c;那么你会想到的第一个问题是“如何开始&#xff1f;”编程语言有数百种可供选择&#xff0c;但是你怎么发现哪个最适合你&#xff0c;你的兴趣和职业目标又在哪里呢&#xff1f;选择最…