您的位置:首页 > 数据库 > MySQL

mysql锁-for update

2015-07-01 13:48 567 查看
文档:

SELECT ... FOR UPDATE sets an exclusive lock on the rows read. An exclusive
lock prevents other sessions from accessing the rows for reading or writing.

阻止其他session的读写锁,排他锁,在读取的行上面

# coding=utf8

import MySQLdb

conn1 = MySQLdb.connect(host="127.0.0.1", user="root", passwd="root", db="app", charset='utf8')
conn2 = MySQLdb.connect(host="127.0.0.1", user="root", passwd="root", db="app", charset='utf8')

cur1 = conn1.cursor(MySQLdb.cursors.DictCursor)
cur2 = conn2.cursor(MySQLdb.cursors.DictCursor)

sql1 = "select prize_id from crazy_prizes where prize_value = 1 and is_sent = 0 limit 1 for update"
print "execute..."
cur1.execute(sql1)
print "execute over...."
rs = cur1.fetchone()
prize_id = rs.get("prize_id")
# update crazy_prizes set is_sent = 1 where prize_id = {prize_id}
print prize_id

# conn1.commit() # release lock
sql2 = "select prize_id from crazy_prizes where prize_value = 2"
cur2.execute(sql1)  # sql1 换成sql2 就不会等待锁了, 因为行锁,这行并有锁
rs2 = cur2.fetchall()

print "==== over ===="


第一次执行输出

execute...

execute over....

后面的==== over ====并没有输出

接着再执行一次

结果只输出execute...

等待一段时间后,脚本执行完毕(MySQL有死锁检查机制, 自动释放锁)

如果我们放开注释commit再试一试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: