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实现批量读取word中表格信息的方法
Jul 30 Python
python删除列表内容
Aug 04 Python
PYTHON压平嵌套列表的简单实现
Jun 08 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
Sep 19 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
jupyter实现重新加载模块
Apr 16 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 Python
Python机器学习之基础概述
May 19 Python
Python Pygame实战在打砖块游戏的实现
Mar 17 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 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
YUI的Tab切换实现代码
2010/04/11 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
Python编程求质数实例代码
2018/01/31 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
pandas数据集的端到端处理
2019/02/18 Python
python and or用法详解
2019/06/26 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
四风存在的原因分析
2014/02/11 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python
anaconda python3.8安装后降级
2021/06/11 Python
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers
win10搭建配置ftp服务器的方法
2022/08/05 Servers