سؤال

وأنا في حيرة حول كيفية تعديل بالتزامن جدول من عدة عمليات مختلفة. لقد حاولت استخدام 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top