SQLAlchemy中的锁定

4 投票
1 回答
6565 浏览
提问于 2025-04-15 14:15

我对如何让多个不同的进程同时修改一个表感到困惑。我尝试过使用 Query.with_lockmode(),但它似乎没有达到我预期的效果,我希望它能防止两个进程同时查询相同的行。以下是我尝试过的:

import time
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import *

engine = create_engine('mysql://...?charset=utf8&use_unicode=0', pool_recycle=3600, echo=False)
Base = declarative_base(bind=engine)
session = scoped_session(sessionmaker(engine))

class Test(Base):
    __tablename__ = "TESTXYZ"
    id = Column(Integer, primary_key=True)
    x = Column(Integer)

def keepUpdating():
    test = session.query(Test).filter(Test.id==1).with_lockmode("update").one()

    for counter in range(5):
        test.x += 10
        print test.x
        time.sleep(2)

    session.commit()


keepUpdating()

如果我同时运行这个脚本两次,结果是 session.query(Test).filter(Test.id==1).one().x 的值是50,而不是100(假设一开始是0),这正是我希望得到的结果。我该如何让两个进程要么同时更新值,要么让第二个进程等到第一个完成后再进行更新呢?

1 个回答

5

你是不是不小心用了MyISAM表?这个在InnoDB表上运行得很好,但如果用MyISAM表的话,就会出现你描述的那种情况(默默地不遵守隔离性)。

撰写回答