sqlite3支持三种数据库锁级别,也叫隔离级别。下面代码中我们对数据库中task表进行更新,然后由另一个线程读取这个表的数据

import

logging

import sqlite3

import

sys

import

threading

import

time

logging.

basicConfig

(

level

=

logging.

DEBUG

,

format

=

'%(asctime)s (%(threadName)-10s) %(message)s'

,

)

db_filename

=

'todo.db'

isolation_level

=

sys.

argv

[

1

]

def writer

(

):

my_name

=

threading.

currentThread

(

).

name

with sqlite3.

connect

(db_filename

,isolation_level

=isolation_level

)

as conn:

cursor

=conn.

cursor

(

)

cursor.

execute

(

'update task set priority=priority+1'

)

logging.

debug

(

'waiting to synchronize'

)

ready.

wait

(

)

# synchronize threads

time.

sleep

(

1

)

conn.

commit

(

)

logging.

debug

(

'CHANGES COMMITTED'

)

return

def reader

(

):

my_name

=

threading.

currentThread

(

).

name

with sqlite3.

connect

(db_filename

,isolation_level

=isolation_level

)

as conn:

cursor

=conn.

cursor

(

)

logging.

debug

(

'waiting to synchronize'

)

ready.

wait

(

)

#synchronize threads

cursor.

execute

(

'select * from task'

)

logging.

debug

(

'SELECT EXECUTED'

)

results

=cursor.

fetchall

(

)

logging.

debug

(

'result fetched'

)

return

if __name__

==

'__main__':

ready

=

threading.

Event

(

)

threads

=

[

threading.

Thread

(name

=

'Reader 1'

,target

=reader

)

,

threading.

Thread

(name

=

'Reader 2'

,target

=reader

)

,

threading.

Thread

(name

=

'Writer 1'

,target

=writer

)

,

threading.

Thread

(name

=

'Writer 2'

,target

=writer

)

,

]

[t.

start

(

)

for t

in threads

]

time.

sleep

(

1

)

logging.

debug

(

'setting ready'

)

ready.

set

(

)

[t.

join

(

)

for t

in threads

]

以下程序演示了,分别使用不同的锁级别操作数据库的结果。

1.使用延迟锁:这种模式是sqlite3的默认模式,也就是只在发生改变的时候才会锁上被更新的记录。

$ python sqlite3_isolation_levels.

py DEFERRED

其输出结果为:

2011-12-13 11:19:38,183

(Reader 1

) waiting to synchronize

2011-12-13 11:19:38,183

(Reader 2

) waiting to synchronize

2011-12-13 11:19:38,187

(Writer 1

) waiting to synchronize

2011-12-13 11:19:39,184

(MainThread

) setting ready

2011-12-13 11:19:39,186

(Reader 1

) SELECT EXECUTED

2011-12-13 11:19:39,186

(Reader 2

) SELECT EXECUTED

2011-12-13 11:19:39,187

(Reader 1

) result fetched

2011-12-13 11:19:39,187

(Reader 2

) result fetched

2011-12-13 11:19:40,243

(Writer 1

) CHANGES COMMITTED

2011-12-13 11:19:40,316

(Writer 2

) waiting to synchronize

2011-12-13 11:19:41,368

(Writer 2

) CHANGES COMMITTED

2.使用“立即锁”:这种模式下一但要更新数据库,会立即锁上这条记录,直到事务提交才会打开锁。

$ python sqlite3_isolation_levels.

py IMMEDIATE

其输出结果为:

2011-12-13 11:27:04,053

(Reader 1

) waiting to synchronize

2011-12-13 11:27:04,053

(Reader 2

) waiting to synchronize

2011-12-13 11:27:04,058

(Writer 1

) waiting to synchronize

2011-12-13 11:27:05,055

(MainThread

) setting ready

2011-12-13 11:27:05,056

(Reader 1

) SELECT EXECUTED

2011-12-13 11:27:05,058

(Reader 1

) result fetched

2011-12-13 11:27:05,058

(Reader 2

) SELECT EXECUTED

2011-12-13 11:27:05,058

(Reader 2

) result fetched

2011-12-13 11:27:06,111

(Writer 1

) CHANGES COMMITTED

2011-12-13 11:27:06,188

(Writer 2

) waiting to synchronize

2011-12-13 11:27:07,244

(Writer 2

) CHANGES COMMITTED

3.使用“排他锁”:这种锁会对所有的读写操作都上锁。这种锁一般用于对数据库性能要求较高的情况,因为一旦上锁,这个数据库连接就只能为一个使用者使用。

$ python sqlite3_isolation_levels.

py EXCLUSIVE

其输出结果为:

2011-12-13 11:32:37,276

(Reader 1

) waiting to synchronize

2011-12-13 11:32:37,276

(Reader 2

) waiting to synchronize

2011-12-13 11:32:37,278

(Writer 1

) waiting to synchronize

2011-12-13 11:32:38,279

(MainThread

) setting ready

2011-12-13 11:32:39,336

(Writer 1

) CHANGES COMMITTED

2011-12-13 11:32:39,367

(Reader 2

) SELECT EXECUTED

2011-12-13 11:32:39,368

(Reader 1

) SELECT EXECUTED

2011-12-13 11:32:39,368

(Reader 2

) result fetched

2011-12-13 11:32:39,371

(Reader 1

) result fetched

2011-12-13 11:32:39,398

(Writer 2

) waiting to synchronize

2011-12-13 11:32:40,453

(Writer 2

) CHANGES COMMITTED

当然我们也可以把锁级别设置为None,这样就是所谓的自动提交模式。我们对上面的代码修改一下,把isolation_level的值设置为None,然后去掉conn.commit()。这样每次的数据库修改会自动提交到数据库。代码如下:

import

logging

import sqlite3

import

sys

import

threading

import

time

logging.

basicConfig

(

level

=

logging.

DEBUG

,

format

=

'%(asctime)s (%(threadName)-10s) %(message)s'

,

)

db_filename

=

'todo.db'

def writer

(

):

my_name

=

threading.

currentThread

(

).

name

with sqlite3.

connect

(db_filename

,isolation_level

=

None

)

as conn:

cursor

=conn.

cursor

(

)

cursor.

execute

(

'update task set priority=priority+1'

)

logging.

debug

(

'waiting to synchronize'

)

ready.

wait

(

)

# synchronize threads

time.

sleep

(

1

)

logging.

debug

(

'CHANGES COMMITTED'

)

return

def reader

(

):

my_name

=

threading.

currentThread

(

).

name

with sqlite3.

connect

(db_filename

,isolation_level

=

None

)

as conn:

cursor

=conn.

cursor

(

)

logging.

debug

(

'waiting to synchronize'

)

ready.

wait

(

)

#synchronize threads

cursor.

execute

(

'select * from task'

)

logging.

debug

(

'SELECT EXECUTED'

)

results

=cursor.

fetchall

(

)

logging.

debug

(

'result fetched'

)

return

if __name__

==

'__main__':

ready

=

threading.

Event

(

)

threads

=

[

threading.

Thread

(name

=

'Reader 1'

,target

=reader

)

,

threading.

Thread

(name

=

'Reader 2'

,target

=reader

)

,

threading.

Thread

(name

=

'Writer 1'

,target

=writer

)

,

threading.

Thread

(name

=

'Writer 2'

,target

=writer

)

,

]

[t.

start

(

)

for t

in threads

]

time.

sleep

(

1

)

logging.

debug

(

'setting ready'

)

ready.

set

(

)

[t.

join

(

)

for t

in threads

]

执行后的输出结果为:

2011-12-13 11:35:00,753

(Reader 1

) waiting to synchronize

2011-12-13 11:35:00,753

(Reader 2

) waiting to synchronize

2011-12-13 11:35:00,825

(Writer 1

) waiting to synchronize

2011-12-13 11:35:00,953

(Writer 2

) waiting to synchronize

2011-12-13 11:35:01,755

(MainThread

) setting ready

2011-12-13 11:35:01,756

(Reader 2

) SELECT EXECUTED

2011-12-13 11:35:01,756

(Reader 1

) SELECT EXECUTED

2011-12-13 11:35:01,757

(Reader 2

) result fetched

2011-12-13 11:35:01,757

(Reader 1

) result fetched

2011-12-13 11:35:02,755

(Writer 2

) CHANGES COMMITTED

2011-12-13 11:35:02,755

(Writer 1

) CHANGES COMMITTED

python写数据库校验_python 验证 sqlite数据库隔离级别相关推荐

  1. Unicode研究之Python将Unihan_Readings.txt转化为SQLite数据库

    实战需求 Python将Unihan_Readings.txt转化为SQLite数据库 Unihan_Readings介绍 从Unihan提取的汉字读音数据库.包含汉语拼音及频率.粤语读法.韩语读法. ...

  2. 数据库的四大特性和事务隔离级别

    数据库中经常被问到四大特性和隔离级别,一般都是涉及到概念性问题,在此做一些整理总结,方便理解. 1.事务的隔离级别 由低到高依次为Read uncommitted(未授权读取.读未提交).Read c ...

  3. 数据库 - 事务管理(ACID)隔离级别 事务传播行为

    转载自   数据库 - 事务管理(ACID)隔离级别 事务传播行为 总览: 事务的4大特性(ACID) 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前 ...

  4. 数据库事务的四大特性以及隔离级别

    本篇文章主要介绍数据库事务的四大特性ACID,以及数据库的隔离级别. 事务 概念 事务指的是满足 ACID 特性的一系列操作.在数据库中,可以通过 Commit提交一个事务,也可以使用 Rollbac ...

  5. python对sqlite增删改查_Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】...

    本文实例讲述了python操作SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的 ...

  6. python创建sqlite3数据库_Python连接SQLite数据库

    Python连接SQLite数据库 SQLite 是一种嵌入式数据库,它的数据库就是一个文件.由于 SQLite 本身是 C 写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在 iOS 和 ...

  7. python操作sqlite数据库_Python 操作SQLite数据库的示例

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.在很多嵌入式产品中使用了它,它占用资源非常的低,python 中默认继承了操作此款数据库的引擎 sq ...

  8. python自带模块连接数据库_Python模块Sqlite数据库模块

    Python模块Sqlite数据库模块简介 从Python2.5以后的版本开始引入SQLite,属于Python内置模块,不需要额外安装.Sqlite以小巧快捷著称.SQLite第一个Alpha版本诞 ...

  9. python读取数据库文件的扩展名_Python读取sqlite数据库文件的方法分析

    本文实例讲述了Python读取sqlite数据库文件的方法.分享给大家供大家参考,具体如下: 这是Python内置的,不需要pip install 包 数据库里面有很多张表 要操作数据库首先要连接co ...

最新文章

  1. 制作ui设计作品集要注意哪些
  2. Python即Python解释器的发展史
  3. java 8大happen-before原则超全面详解
  4. luncene 查询字符串的解析—QueryParser类
  5. [云炬创业管理笔记]第三章打造优秀创业团队讨论4
  6. 【Leetcode | 12】342. 4的幂
  7. 图解HTTP知识框架
  8. OpenCV imread读取图片,imshow展示图片,出现cv:Exception at memory location异常
  9. 远程心电监护系统在现代医疗中的应用
  10. CODEVS1067:机器翻译(模拟水题)
  11. Google不要成为在垃圾桶里翻扒的猫
  12. cnnvd爬取漏洞信息
  13. 计算机网络谢希仁第八版 课后答案第七版课后答案
  14. 防护等级 ipx9、ipx9k、ip69、ip69k之间的区别
  15. 总结:KPCB中国合伙人周炜
  16. 计算机右键新建显示为空,Win7鼠标右键新建为空这么办 win7电脑右键选项为空白如何解决...
  17. 在Windows里面使用binwalk工具分离图片
  18. 看了几个技术入股的帖子,忍不住写个自己亲身经历吧
  19. 基于Java实现的定时给微信好友发送消息
  20. off文件转obj文件

热门文章

  1. 装完黑苹果怎么装windows_BlackArch(黑Arch)、怎么装?
  2. 深度学习优化算法总结
  3. ubuntu18.04下安装中文输入法
  4. 推荐10个CI/CD工具,用于云平台集成交付
  5. LeetCode 142——环形链表 II
  6. 27.CSS3文本效果
  7. Meteor工作目录的划分
  8. linux下改变文件的字符编码
  9. 使用UI Automation实现自动化测试 --工具使用
  10. @ResponseBody,@RequestBody,@PathVariable