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 sort、sorted高级排序技巧
Nov 21 Python
Python fileinput模块使用介绍
Nov 30 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
python实现决策树分类(2)
Aug 30 Python
Python面向对象总结及类与正则表达式详解
Apr 18 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
jupyter notebook的安装与使用详解
May 18 Python
DataFrame.groupby()所见的各种用法详解
Jun 14 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 Python
pandas DataFrame.shift()函数的具体使用
May 24 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应用程序来获取Web服务器的状态信息
2006/10/09 PHP
PHP正则表达式之捕获组与非捕获组
2015/11/06 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
Javascript倒计时代码
2010/08/12 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
js实现简单秒表走动的时钟特效
2020/03/25 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
JavaScript canvas实现文字时钟
2021/01/10 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
python如何实现一个刷网页小程序
2018/11/27 Python
python做反被爬保护的方法
2019/07/01 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
Python字符串三种格式化输出
2020/09/17 Python
马来西亚最好的婴儿商店:Motherhood
2017/09/14 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
挂科检讨书范文
2014/02/20 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
我爱读书演讲稿
2014/05/07 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
董事长助理工作总结2015
2015/07/23 职场文书