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分割TXT文件成4K的TXT文件
May 23 Python
Python进程间通信用法实例
Jun 04 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
Python中标准库OS的常用方法总结大全
Jul 19 Python
对python3 中方法各种参数和返回值详解
Dec 15 Python
对PyQt5中树结构的实现方法详解
Jun 17 Python
Python实现aes加密解密多种方法解析
May 15 Python
详解python如何引用包package
Jun 07 Python
在keras里实现自定义上采样层
Jun 28 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
Python 实现PS滤镜的旋涡特效
Dec 03 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
逐步提升php框架的性能
2008/01/10 PHP
PHP4中session登录页面的应用
2008/07/25 PHP
PHP 简单数组排序实现代码
2009/08/05 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
php数据访问之增删改查操作
2016/05/09 PHP
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
解决vue 项目引入字体图标报错、不显示等问题
2018/09/01 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
python实现拼接图片
2020/03/23 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
医学专业毕业生个人求职信
2013/12/25 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python
教你怎么用python实现字符串转日期
2021/05/24 Python
Django drf请求模块源码解析
2021/06/08 Python
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android