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秒 ,完全反过来了

pythonsqlite事务_python sqlite3 的事务控制相关推荐

  1. python sqlite3事务_Python/SQLite3:无法提交-没有事务是acti

    我试图使用Python(传统的,2.7)和SQLite(3)来编写book indexer. 代码可以归结为以下SQL语句序列:'select count(*) from tag_dict' () / ...

  2. mysql 不同连接的事务 会嵌套_MySQL——事务

    事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致状态转换为另一种一致状态. 关键词 事务四大特性ACID MySql事务隔离级别 MVCC多版本并发控制 实 ...

  3. 谈谈分布式事务之三: System.Transactions事务详解[下篇]

    在前面一篇给出的Transaction的定义中,信息的读者应该看到了一个叫做DepedentClone的方法.该方法对用于创建基于现有Transaction对 象的"依赖事务(Depende ...

  4. java分布式事务原理_JAVA分布式事务原理及应用

    JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序的JTA支持极大地增强了数据访问能力. 本文的目的是要 ...

  5. mysql事务实现数据更新_MySql事务select for update及数据的一致性处理讲解

    MySQL中的事务,默认是自动提交的,即autocommit = 1: 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, 如果 ...

  6. Spring JDBC-Spring事务管理之数据库事务基础知识

    概述 数据库事务的概念 原子性 一致性 隔离性 持久性 数据并发的问题 脏读dirty read 不可重复读unrepeatable read 幻象读 phantom read 幻象读和不可重复度的区 ...

  7. 七种常见分布式事务详解(2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通知)

    分布式事务:在分布式系统中一次操作需要由多个服务协同完成,这种由不同的服务之间通过网络协同完成的事务称为分布式事务 一.2PC: 2PC,两阶段提交,将事务的提交过程分为资源准备和资源提交两个阶段,并 ...

  8. 服务器无法执行该事务_分布式事务、MVCC、事务隔离级别

    我们都知道,OceanBase 是一个分布式数据库,数据是打散到多台服务器上的,当一个分布式事务要执行的时候,可能需要跨越多台 OB Server,如果在执行过程中遇到各种各样的异常情况,OceanB ...

  9. mysql开启事务_MySQL入门之事务(上)

    事务 事务介绍 事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功 数据库开启事务命令 start transaction 开启事务 (等同于set autoco ...

最新文章

  1. Linux下 memcached安装以及启动
  2. AjaxControlToolkit中CalendarExtender日历控件的用法
  3. Java软件架构师所要需的东西
  4. resultset需要关闭吗_液氮不锈钢补给瓶外筒上有一小块结霜能用吗
  5. 【Android 逆向】代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )
  6. 学习VUE时,利用webpack打包的错误处理方法
  7. ArcMap 导入Excel坐标数据
  8. 若微型计算机在工作时突然断电,16秋《计算机基础》作业1
  9. 一个简单python爬虫的实现——爬取电影信息
  10. php有空语句吗?,php是空还是空?
  11. 【大咖有约】58同城孙玄:58同城从MongoDB到MySQL迁移之路
  12. Web 攻防第一阶段 I-03:收集 Web 站点信息
  13. 关闭chrome 的内置PDF 查看器
  14. 计算机木材染色 配色技术的应用技术,计算机配色技术在木材连缸染色中的应用研究.pdf...
  15. 静态代理和动态代理的区别和联系
  16. 用什么软件免费查重呢?4款比较靠谱的论文查重软件值得一试
  17. python any_python的any
  18. CAD全版本软件安装包(含最新2023)
  19. IoT黑板报0112:谷歌关闭Titan无人机上网项目
  20. 菜鸟Django--更改和删除

热门文章

  1. 用于数据分析的Python – Pandas
  2. b树范围查找_使用段树查找最大查询范围
  3. 链表竟然比数组慢了1000多倍?(动图+性能评测)
  4. Redis 中的过期元素是如何被处理的?「视频版」——面试突击 002 期
  5. 【Python】输入任意个数元素并保存至列表
  6. Windows MinGW配置C、C++编译环境
  7. JupyterHub on Kubernetes-Helm安装
  8. 上机环境是什么意思_380元入手RX580满血显卡,跑分17万,还要什么自行车
  9. cmd窗口使用python提示“Python not found”,可能是环境变量配置的原因
  10. linux查看r的安装路径,在Linux CentOS 6.5版上安装R3.1.1的问题(检查LDFLAGS以获取Fortran库的路径)...