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中的zip函数使用示例
Jan 29 Python
python获取本机mac地址和ip地址的方法
Apr 29 Python
Python字符串替换实例分析
May 11 Python
如何利用python制作时间戳转换工具详解
Sep 12 Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 Python
python实现接口并发测试脚本
Jun 25 Python
python字典嵌套字典的情况下找到某个key的value详解
Jul 10 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
Python函数式编程指南:对生成器全面讲解
Nov 19 Python
python+selenium+PhantomJS抓取网页动态加载内容
Feb 25 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 Python
如何利用Python动态模拟太阳系运转
Sep 04 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网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
JavaScript 学习笔记(十五)
2010/01/28 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
[58:37]Serenity vs Fnatic 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
实例讲解python函数式编程
2014/06/09 Python
Python卸载模块的方法汇总
2016/06/07 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
python xml解析实例详解
2016/11/14 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
python实现AES加密与解密
2019/03/28 Python
基于python实现把图片转换成素描
2019/11/13 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
北京某科技有限公司C# .net笔试题
2014/09/27 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
心理健康教育心得体会
2013/12/29 职场文书
公司委托书格式范文
2014/04/04 职场文书
英语教师自荐信
2014/05/26 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
财务工作失误检讨书
2015/02/19 职场文书
项目经理助理岗位职责
2015/04/13 职场文书