import datetime
from peewee importAutoField,DateTimeField,Model,SqliteDatabase,TextField,IntegerFielddb =SqliteDatabase('my_app.db', pragmas={'journal_mode':'wal'})classBaseModel(Model):"""A base model that will use our Sqlite database.""" id =AutoField() update_time =DateTimeField(default=datetime.datetime.now)classMeta: database = db
classUser(BaseModel): name =TextField() age =IntegerField()classMeta: table_name ="user"if __name__ =="__main__": db.connect() db.create_tables([User])User.create(name="ljk", age=29) res =User.select()for i in res:print(i.name, i.age)
3|0串行写操作不会锁库
串行执行不会锁表,同时也说明事务完成之后锁立即释放
import time
import threading
from peewee_demo importUserdef write_sql(num): user =User.get_by_id(1)print(f"传入数值:{num}")print("睡眠10s, 开始") time.sleep(10)print("睡眠10s, 结束") user.age = num
user.save()write_sql(100)write_sql(300)
传入数值:100睡眠10s,开始睡眠10s,结束传入数值:300睡眠10s,开始睡眠10s,结束
4|0两个线程同时写会锁表
import time
import random
import threading
from peewee_demo importUserdef write_sql(index): users =User.select()for user in users: user.age = random.randint(100,200)print(f"in {index} , now is {time.time()}") user.save()if __name__ =="__main__": p1 = threading.Thread(target=write_sql, args=(1,)) p2 = threading.Thread(target=write_sql, args=(2,)) p1.start() p2.start() p1.join() p2.join()
(idt_dev)➜ peewee_sqlite python main.py
in1, now is1691136403.4496074in2, now is1691136403.4499302Exceptionin thread Thread-2:Traceback(most recent call last):File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3246,in execute_sql
cursor.execute(sql,paramsor())sqlite3.OperationalError: database is locked
During handling of the above exception, another exception occurred:Traceback(most recent call last):File"/usr/local/lib/python3.8/threading.py", line 932,in _bootstrap_inner
self.run()File"/usr/local/lib/python3.8/threading.py", line 870,in run
self._target(*self._args,**self._kwargs)File"main.py", line 13,in write_sql
user.save()File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 6785,in save
rows =self.update(**field_dict).where(self._pk_expr()).execute()File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 1966,in inner
return method(self, database,*args,**kwargs)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 2037,in execute
returnself._execute(database)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 2555,in _execute
cursor = database.execute(self)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3254,in execute
returnself.execute_sql(sql,params)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3246,in execute_sql
cursor.execute(sql,paramsor())File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3014,in __exit__
reraise(new_type, new_type(exc_value,*exc_args), traceback)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 192,in reraise
raisevalue.with_traceback(tb)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3246,in execute_sql
cursor.execute(sql,paramsor())peewee.OperationalError: database is locked
in1, now is1691136403.4617224in1, now is1691136403.467874in1, now is1691136403.475302in1, now is1691136403.4822652in1, now is1691136403.489331in1, now is1691136403.4965873in1, now is1691136403.5043068in1, now is1691136403.5117881in1, now is1691136403.5194569in1, now is1691136403.5266187in1, now is1691136403.5337832in1, now is1691136403.5410187in1, now is1691136403.5481625in1, now is1691136403.555381in1, now is1691136403.5625844in1, now is1691136403.569803in1, now is1691136403.5772254in1, now is1691136403.5843408in1, now is1691136403.5914726
5|0同时一个读+一个写不会锁表
import time
import random
import threading
from peewee_demo importUserdef write_sql(index): users =User.select()for user in users: user.age = random.randint(100,200)print(f"in write {index} , now is {time.time()}") user.save()def read_sql(index): users =User.select()for user in users:print(f"in read {index}, now is {time.time()}, name: {user.name}")if __name__ =="__main__": p1 = threading.Thread(target=write_sql, args=(1,)) p2 = threading.Thread(target=read_sql, args=(2,)) p1.start() p2.start() p1.join() p2.join()
in write 1, now is1691136578.3930526in read 2, now is1691136578.3933816, name: person_P0
in read 2, now is1691136578.3934226, name: person_P1
in read 2, now is1691136578.3934548, name: person_P2
in read 2, now is1691136578.3934836, name: person_P3
in read 2, now is1691136578.3935122, name: person_P4
in read 2, now is1691136578.3935406, name: person_P5
in read 2, now is1691136578.3935676, name: person_P6
in read 2, now is1691136578.393595, name: person_P7
in read 2, now is1691136578.3936222, name: person_P8
in read 2, now is1691136578.3936503, name: person_P9
in read 2, now is1691136578.3936775, name: person_P10
in read 2, now is1691136578.393705, name: person_P11
in read 2, now is1691136578.3937323, name: person_P12
in read 2, now is1691136578.3937595, name: person_P13
in read 2, now is1691136578.3937871, name: person_P14
in read 2, now is1691136578.3938174, name: person_P15
in read 2, now is1691136578.3938463, name: person_P16
in read 2, now is1691136578.3938737, name: person_P17
in read 2, now is1691136578.393901, name: person_P18
in read 2, now is1691136578.3939342, name: person_P19
in write 1, now is1691136578.4051046in write 1, now is1691136578.4108906in write 1, now is1691136578.4169016in write 1, now is1691136578.4225135in write 1, now is1691136578.4282284in write 1, now is1691136578.4340622in write 1, now is1691136578.4397743in write 1, now is1691136578.4456632in write 1, now is1691136578.451795in write 1, now is1691136578.4575145in write 1, now is1691136578.463979in write 1, now is1691136578.471128in write 1, now is1691136578.4781554in write 1, now is1691136578.4851305in write 1, now is1691136578.4925086in write 1, now is1691136578.4996982in write 1, now is1691136578.5068758in write 1, now is1691136578.5138164in write 1, now is1691136578.520577
6|0加锁
加锁和数据库设置:
不管加什么锁,都不能解决lock的问题
是否设置读写模式都不影响读写操作
db =SqliteDatabase('my_app.db', pragmas={'journal_mode':'wal'})
def write_sql(index): users =User.select()# with db.atomic("IMMEDIATE"):with db.atomic("EXCLUSIVE"):print("user")for user in users:try: user.age = random.randint(100,200) time.sleep(1)print(f"in write {index} , now is {time.time()}") user.save()exceptExceptionas e:print(e)in write 10, now is1691142036.4625945in write 10, now is1691142037.464804in write 10, now is1691142038.467277in write 10, now is1691142039.4688525Exceptionin thread Thread-2:Traceback(most recent call last):File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3246,in execute_sql
cursor.execute(sql,paramsor())sqlite3.OperationalError: database is locked
During handling of the above exception, another exception occurred:Traceback(most recent call last):File"/usr/local/lib/python3.8/threading.py", line 932,in _bootstrap_inner
self.run()File"/usr/local/lib/python3.8/threading.py", line 870,in run
self._target(*self._args,**self._kwargs)File"main.py", line 11,in write_sql
in write 10, now is1691142040.4720113with db.atomic("EXCLUSIVE"):File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 4363,in __enter__
returnself._helper.__enter__()File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 4398,in __enter__
self._begin()File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 4384,in _begin
self.db.begin(*args,**kwargs)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3765,inbeginself.execute_sql(statement)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3246,in execute_sql
cursor.execute(sql,paramsor())File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3014,in __exit__
reraise(new_type, new_type(exc_value,*exc_args), traceback)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 192,in reraise
raisevalue.with_traceback(tb)File"/home/ljk/.virtualenvs/idt_dev/lib/python3.8/site-packages/peewee.py", line 3246,in execute_sql
cursor.execute(sql,paramsor())peewee.OperationalError: database is locked
in write 10, now is1691142041.4745347in write 10, now is1691142042.4767966in write 10, now is1691142043.4779344in write 10, now is1691142044.4796853in write 10, now is1691142045.482223in write 10, now is1691142046.4840803in write 10, now is1691142047.4864902in write 10, now is1691142048.4888134in write 10, now is1691142049.491353in write 10, now is1691142050.4932055in write 10, now is1691142051.4950705in write 10, now is1691142052.496692in write 10, now is1691142053.4988236in write 10, now is1691142054.500759in write 10, now is1691142055.5022364
7|0解决方案
from gpt3.5
SQLite 是一种嵌入式数据库,它默认情况下不支持多个进程同时写入。然而,有几种方法可以解决这个问题:
import time
import random
import threading
from base_model importUser, db
Lock=Falsedef write_sql(index): time.sleep(random.randint(1,4))globalLockifLock:print(f"i am {index}, 数据库被lock,退出执行")returnelse:print(f"i am {index}, 数据库可以使用")Lock=True user =User.get_by_id(10) user.age =200 user.save()Lock=Falseif __name__ =="__main__": data =[]for i in range(20): p = threading.Thread(target=write_sql, args=(i,)) data.append(p)for i in data: i.start()for i in data: i.join()
(dev)➜ peewee_sqlite python main.py
i am 6,数据库可以使用i am 4,数据库可以使用i am 8,数据库可以使用i am 19,数据库可以使用i am 16,数据库可以使用i am 1,数据库可以使用i am 0,数据库可以使用i am 10,数据库可以使用i am 2,数据库可以使用i am 11,数据库可以使用i am 7,数据库可以使用i am 9,数据库可以使用i am 3,数据库可以使用i am 17,数据库可以使用i am 12,数据库可以使用i am 14,数据库可以使用i am 5,数据库可以使用i am 15,数据库可以使用i am 13,数据库可以使用i am 18,数据库被lock,退出执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)