Python 的 ORM 库 —— peewee 在多线程下是事务安全的吗?

Python 的 ORM 库 —— peewee  在多线程下是事务安全的吗?

peewee 的机制,我感觉是建立一个全局的 db 变量,然后所有的线程共用这个 db 变量。

但是这样有一个问题就是,这种方式是事务安全的吗?

解释一下我理解的事务安全:就是线程A begin 了一个事务,此时线程 B 也 begin 了一个事务,那线程 A 的事务会被线程 B 打断,这就是多线程事务不安全的(在同一个 connect 中,后者的 begin 会强制提交前者的 begin)
而 Peewee 这种全局一个 db 变量的方式安全吗?
peewee 的全局变量 db 就是对应一个数据库 connect 是吗?
peewee 不是自带连接池的对吗?
from enum import unique

from 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

回到顶部