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中的分片与截断序列
Aug 09 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
python3.6利用pyinstall打包py为exe的操作实例
Oct 31 Python
Python文件如何引入?详解引入Python文件步骤
Dec 10 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
python使用 cx_Oracle 模块进行查询操作示例
Nov 28 Python
django 框架实现的用户注册、登录、退出功能示例
Nov 28 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 Python
Python基于xlrd模块处理合并单元格
Jul 28 Python
python 批量将中文名转换为拼音
Feb 07 Python
教你用python控制安卓手机
May 13 Python
Python深度学习之实现卷积神经网络
Jun 05 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
星际流派综述
2020/03/04 星际争霸
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
php实现网站留言板功能
2015/11/04 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
PHP的自定义模板引擎
2017/03/24 PHP
JavaScript Eval 函数使用
2010/03/23 Javascript
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
django解决跨域请求的问题
2018/11/11 Python
python使用PyQt5的简单方法
2019/02/27 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
电大毕业生自我鉴定
2013/11/10 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
赡养老人协议书
2014/04/21 职场文书
大学英语演讲稿范文
2014/04/24 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
单位同意报考证明
2015/06/17 职场文书
会议新闻稿
2015/07/17 职场文书
日本读研:怎样写好一篇日本研究计划书?
2019/07/15 职场文书