Python 的 ORM 库 —— peewee 在多线程下是事务安全的吗?
peewee
的机制,我感觉是建立一个全局的 db 变量,然后所有的线程共用这个 db 变量。
但是这样有一个问题就是,这种方式是事务安全的吗?
解释一下我理解的事务安全:就是线程A begin 了一个事务,此时线程 B 也 begin 了一个事务,那线程 A 的事务会被线程 B 打断,这就是多线程事务不安全的(在同一个 connect 中,后者的 begin 会强制提交前者的 begin)
而 Peewee 这种全局一个 db 变量的方式安全吗?
peewee 的全局变量 db 就是对应一个数据库 connect 是吗?
peewee 不是自带连接池的对吗?
from enum import uniquefrom peewee import *
import settings
host = settings.DATABASE.host
port = settings.DATABASE.port
username = settings.DATABASE.username
password = settings.DATABASE.password
database_name = settings.DATABASE.database
db = MySQLDatabase(
database=database_name,
host=host,
port=port,
user=username,
password=password
)
class PictureForSource(Model):
id = AutoField()
uuid = CharField(unique=True, index=True)
path = CharField(max_length=1024, help_text='oss 路径')
file_size = IntegerField(help_text='单位:Bytes')
meta_title = CharField(max_length=256)
author = CharField(max_length=256)
release_date = DateTimeField()
created_at = DateTimeField(
null=False,
constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')]
)
class Meta:
database = db
table_name = 'source'
还有一个问题就是 peewee
怎么实现类似 Django ORM
那种为每个请求独立建立一个数据库连接,不管这个 request 的生命周期有多少次 crud 操作都封装在一个 connect 里面,send response 之后就 close 这个 connect
虽然 peewee 提供了一个 connection_context
但是这玩意可以跨多个函数使用吗?
python">def get_video_id(short_uuid: str) -> tuple | None: with db.connection_context():
rows = TinyUrl.select(TinyUrl.video_id, TinyUrl.user_id).where(
(TinyUrl.short_uuid == short_uuid)
)
if rows:
return rows[0].video_id, rows[0].user_id
else:
return None
回答:
peewee.thread-safety
Peewee keeps track of the connection state using thread-local storage, making the Peewee Database object safe to use with multiple threads. Each thread will have it’s own connection, and as a result any given thread will only have a single connection open at a given time.
回答:
又要复用连接,又要并发安全,有两种方式:
- TLS(Thread Local Storage)
- connection pool
peewee 使用的是 TLS
(Thread Local Storage),所以 peewee 在多线程下是事务安全的!
以上是 Python 的 ORM 库 —— peewee 在多线程下是事务安全的吗? 的全部内容, 来源链接: utcz.com/p/938467.html