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 相关文章推荐
Python getopt模块处理命令行选项实例
May 13 Python
让Python代码更快运行的5种方法
Jun 21 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
基于python绘制科赫雪花
Jun 22 Python
python实现学员管理系统
Feb 26 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
python文字转语音的实例代码分析
Nov 12 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
基于h5py的使用及数据封装代码
Dec 26 Python
django 外键创建注意事项说明
May 20 Python
Python 中面向接口编程
May 20 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
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php 安全过滤函数代码
2011/05/07 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
Python实现二分法算法实例
2015/02/02 Python
python中zip和unzip数据的方法
2015/05/27 Python
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
大学生职业生涯规划范文
2014/01/08 职场文书
毕业证丢失证明
2014/01/15 职场文书
音乐教学随笔感言
2014/02/19 职场文书
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
2015年工商所工作总结
2015/05/21 职场文书
个人收入证明范本
2015/06/12 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
详解Redis主从复制实践
2021/05/19 Redis
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python