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对两个有序列表进行合并和排序的例子
Jun 13 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
Python视频爬虫实现下载头条视频功能示例
May 07 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
对python中的try、except、finally 执行顺序详解
Feb 18 Python
python画图——实现在图上标注上具体数值的方法
Jul 08 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
Django通过dwebsocket实现websocket的例子
Nov 15 Python
Python FFT合成波形的实例
Dec 04 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
Python虚拟环境virtualenv创建及使用过程图解
Dec 08 Python
Elasticsearch 数据类型及管理
Apr 19 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小偷的核心程序
2007/04/09 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
php旋转图片90度的方法
2013/11/07 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
vue插件实现v-model功能
2018/09/10 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
Python中的super用法详解
2015/05/28 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
Python常见工厂函数用法示例
2018/03/21 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
python如何更新包
2020/06/11 Python
python爬虫判断招聘信息是否存在的实例代码
2020/11/20 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
八年级物理教学反思
2014/01/19 职场文书
个人求职信范例
2014/01/29 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
oracle索引总结
2021/09/25 Oracle
python数据处理之Pandas类型转换
2022/04/28 Python
Nginx 匹配方式
2022/05/15 Servers