锁定sqlalchemy

我对如何从几个不同的进程中同时修改表感到困惑.我试过使用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开始).这就是我所希望的.如何获得两个过程以同时更新值或让第二个过程等待第一个完成?

解决方法:

您是否偶然使用MyISAM表?这对于InnoDB表可以很好地工作,但是MyISAM具有描述的行为(尊重隔离的静默失败).

上一篇:java-通过锁进行链锁


下一篇:(七)Transformation和action详解-Java&Python版Spark