Python Sqlalchemy如何实现select for update


Posted in Python onOctober 12, 2020

sqlalchemy 对于行级锁有两种实现方式,with_lockmode(self, mode): 和 with_for_update(self, read=False, nowait=False, of=None),前者在sqlalchemy 0.9.0 被废弃,用后者代替。所以我们使用with_for_update !

看下函数的定义:

@_generative()
  def with_for_update(self, read=False, nowait=False, of=None):
    """return a new :class:`.Query` with the specified options for the
    ``FOR UPDATE`` clause.
 
    The behavior of this method is identical to that of
    :meth:`.SelectBase.with_for_update`. When called with no arguments,
    the resulting ``SELECT`` statement will have a ``FOR UPDATE`` clause
    appended. When additional arguments are specified, backend-specific
    options such as ``FOR UPDATE NOWAIT`` or ``LOCK IN SHARE MODE``
    can take effect.
 
    E.g.::
 
      q = sess.query(User).with_for_update(nowait=True, of=User)
 
    The above query on a Postgresql backend will render like::
 
      SELECT users.id AS users_id FROM users FOR UPDATE OF users NOWAIT
 
    .. versionadded:: 0.9.0 :meth:`.Query.with_for_update` supersedes
      the :meth:`.Query.with_lockmode` method.
 
    .. seealso::
 
      :meth:`.GenerativeSelect.with_for_update` - Core level method with
      full argument and behavioral description.
 
    """
     
read
  是标识加互斥锁还是共享锁. 当为 True 时, 即 for share 的语句, 是共享锁. 多个事务可以获取共享锁, 互斥锁只能一个事务获取. 有"多个地方"都希望是"这段时间我获取的数据不能被修改, 我也不会改", 那么只能使用共享锁.
nowait
  其它事务碰到锁, 是否不等待直接"报错".
of
  指明上锁的表, 如果不指明, 则查询中涉及的所有表(行)都会加锁.

q = sess.query(User).with_for_update(nowait=True, of=User)

对应于sql:

SELECT users.id AS users_id FROM users FOR UPDATE OF users NOWAIT

Python Sqlalchemy如何实现select for update

mysql 不支持这几个参数,转成sql都是:

SELECT users.id AS users_id FROM users FOR UPDATE

范例:

def query_city_for_update():
  session = get_session()
  with session.begin():
    query = session.query(City).with_for_update().filter(City.ID == 8)
    print 'SQL : %s' % str(query)
    print_city_info(query.first())

结果:

SQL : SELECT city."ID" AS "city_ID", city."Name" AS "city_Name", city."CountryCode" AS "city_CountryCode", city."District" AS "city_District", city."Population" AS "city_Population" 
FROM city 
WHERE city."ID" = :ID_1 FOR UPDATE

{'city': {'population': 234323, 'district': u'Utrecht', 'id': 8, 'country_code': u'NLD', 'name': u'Utrecht'}}

SELECT ... FOR UPDATE 的用法,不过锁定(Lock)的数据是判别就得要注意一下了。由于InnoDB 预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则mysql 将会执行Table Lock (将整个数据表单给锁住)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
MySQLdb ImportError: libmysqlclient.so.18解决方法
Aug 21 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
Django后台获取前端post上传的文件方法
May 28 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
Jan 30 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
Python中__repr__和__str__区别详解
Nov 07 Python
使用Django清空数据库并重新生成
Apr 03 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
Python3中对json格式数据的分析处理
Jan 28 Python
浅析PyCharm 的初始设置(知道)
Oct 12 #Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 #Python
Django windows使用Apache实现部署流程解析
Oct 12 #Python
详解Django ORM引发的数据库N+1性能问题
Oct 12 #Python
如何实现一个python函数装饰器(Decorator)
Oct 12 #Python
Vs Code中8个好用的python 扩展插件
Oct 12 #Python
Django中和时区相关的安全问题详解
Oct 12 #Python
You might like
用php过滤危险html代码的函数
2008/07/22 PHP
php自定义错误处理用法实例
2015/03/20 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
Python实现控制台输入密码的方法
2015/05/29 Python
Python反转序列的方法实例分析
2018/03/21 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
如何对python的字典进行排序
2020/06/19 Python
python为什么要安装到c盘
2020/07/20 Python
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
外科实习自我鉴定
2013/10/06 职场文书
5.1手机促销活动
2014/01/17 职场文书
三查三看党性分析材料
2014/02/18 职场文书
会议主持词
2014/03/17 职场文书
股东协议书
2014/04/14 职场文书
篮球社团活动总结
2014/06/27 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
酒会邀请函
2015/01/31 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
python之django路由和视图案例教程
2021/07/26 Python