I'm confused with how Query.with_lockmode('update') works in sqlalchemy.
My code is in attachment.
For testing, I start test.py in 1st terminal, then start test.py in 2nd
terminal.
so the 2nd termial will read the data modified by 1st test.py.
But the 2nd terminal's output contains L42 in test.py.
It means the 2nd test.py select x for update is still a 'snapshot read'.
In my opinion, the variable 'locking_u' should be the one changed by 1st
terminal, locking.name should be 'aa'.
Because it's [current read] in 'select x for update' mysql sentences.
And mysql Isolation level is RR.
My test table is as below:
mysql> select * from user_test;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | NULL |
+----+------+
Thank you so much if you can understand and help me.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.
#!/usr/bin/env python
import time
import os
from sqlalchemy import create_engine
from sqlalchemy import func, or_, not_
from sqlalchemy import Column
from sqlalchemy.orm import sessionmaker
from sqlalchemy.types import CHAR, Integer, String
from sqlalchemy.ext.declarative import declarative_base
BaseModel = declarative_base()
DB_CONNECT_STRING = 'mysql+mysqldb://[email protected]:3006/test'
engine = create_engine(DB_CONNECT_STRING, echo=True)
DB_Session = sessionmaker(bind=engine)
session = DB_Session()
class User(BaseModel):
__tablename__ = 'user_test'
__table_args__ = {
'mysql_engine': 'InnoDB'
}
id = Column(Integer, primary_key=True)
name = Column(CHAR(30))
def __str__(self):
return 'User[%d, %s]' % (self.id, self.name)
u = session.query(User).filter(User.name == 'a').first()
print 'before locking'
locking_u = session.query(User).\
with_lockmode('update').\
filter(User.id == u.id).\
first()
print locking_u
if locking_u and locking_u.name == 'a':
print 'change'
locking_u.name = 'aa'
else:
print 'no change'
time.sleep(10)
session.commit()
print 'after locking'