for update详解

  • 一、for update的定义
  • 二、什么叫悲观锁,什么叫乐观锁
  • 三、for update的使用场景
  • 四、for update的应用

一、for update的定义

首先我们要知道for update是一种行级锁,我们又叫排它锁,一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的数据行.如果其它用户想更新该表中的数据行,则也必须对该表施加行级锁.即使多个用户对一个表均使用了共享更新,但也不允许两个事务同时对一个表进行更新,真正对表进行更新时,是以独占方式锁表,一直到提交或复原该事务为止。行锁永远是独占方式锁。
只有当出现如下之一的条件,才会释放共享更新锁:
1、执行提交(COMMIT)语句
2、退出数据库(LOG OFF)
3、程序停止运行

二、什么叫悲观锁,什么叫乐观锁

我们来了解一下什么叫悲观锁,什么叫乐观锁。
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它解锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。就像for update,再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。
乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。

三、for update的使用场景

显而易见,for update是一种悲观锁,在什么样的场景下才会使用for update呢?借助for update语句,我们可以在应用程序的层面手工实现数据加锁保护操作。就是那些需要业务层面数据独占时,可以考虑使用for update。
场景上,比如火车票订票,在屏幕上显示有票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,我们可以使用for update。

四、for update的应用

select for update 是为了在查询时,对这条数据进行加锁,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性.
几个类似的场景:
select * from table for update 会等待行锁释放之后,返回查询结果。
select * from table for update nowait 不等待行锁释放,提示锁冲突,不返回结果
select * from table for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
select * from table for update skip locked 查询返回查询结果,但忽略有行锁的记录
SELECT…FOR UPDATE 语句的语法如下:
  SELECT … FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
其中:
  OF 子句用于指定即将更新的列,即锁定行上的特定列。
  WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。
“使用FOR UPDATE WAIT”子句的优点如下:
  1防止无限期地等待被锁定的行;
  2允许应用程序中对锁的等待时间进行更多的控制。
  3对于交互式应用程序非常有用,因为这些用户不能等待不确定
  4 若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告

什么是sql的for update相关推荐

  1. 【转载】SQL中使用update inner join和delete inner join

    原文地址:SQL中使用update inner join和delete inner join Update XXX set XXX where 这种写法大家肯定都知道,才发现update和delete ...

  2. SQL Server 中update的小计

    update中涉及到多个表的: 1.update TableA set a.ColumnC=b.ColumnC from TableA a inner join TableB b on a.Colum ...

  3. centos写mysql光标移到上一行_mysql:一条SQL更新语句(update)是如何执行的

    一条更新语句的执行流程又是怎样的呢? 之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢? 我们还是从一个表的一条更新语 ...

  4. 根据指定字段排序编号(SQL Server 2005,Update,Order By)

    在SQL Server 2005可以通过with as根据指定的字段排序编号,SQL语句如下: WITH 表1 AS ( SELECT 编号字段名, ROW_NUMBER() OVER(ORDER B ...

  5. SQL Server 创建update、delete触发器实例

    这学期刚刚学数据库,上课的时候老师主要讲的是理论.但是上机时需要实操写SQL语句,便觉得十分困难.数据库小白在大量的文章中搜索,发现许多文章对于小白来说非常不友好(maybe是笔者道行还不深),花了一 ...

  6. SQL跨库UPDATE

    查看班级信息 SELECT * FROM [dbo].[ClassDemo] 查看学生信息 SELECT * FROM [dbo].[StudentDemo] 由于原来班级名是"班级a&qu ...

  7. mysql update exists_mysql – SQL – 如果EXISTS UPDATE ELSE INSERT语...

    我有以下SQL查询: IF EXISTS(SELECT * FROM component_psar WHERE tbl_id = '2' AND row_nr = '1') UPDATE compon ...

  8. mysql 触发器 sql日志_sql update 触发器 可获得被update的行的信息

    SQL Server 2005 学习笔记之触发器简介[转] 触发器实际上就是一种特殊类型的存储过程,其特殊性表现在:它是在执行某些特定的T-SQL语句时自动的. 11.1 触发器简介 触发器实际上就是 ...

  9. 【SQL】 delete update中使用inner join

    Update  Update XXX set XXX where 这种写法大家肯定都知道,update和delete支持inner join的update方式,这个在表间关联来做更新和删除操作非常有用 ...

  10. sql insert and update

    1 二者的区别 insert是插入一条新的数据,它会创建一条新的记录:update是更新一条已经有的数据,它不会创建新的记录. update需要where来指示更新那条记录,否则会更新所有的记录. 2 ...

最新文章

  1. C++文件输入和输出
  2. 5G多输入多输出技术,到底是个啥东东?
  3. centos安装python3.8与pip
  4. ubuntu虚拟机进程被杀死_Linux进程被杀掉(OOM killer),查看系统日志
  5. Scheme报错define-values: assignment disallowed; cannot change constant
  6. win10跳过计算机密码,Win10怎么取消开机密码?Win10如何跳过开机密码?
  7. 斐讯 k3 设置 虚拟服务器,斐讯K3无线中继设置教程(无线扩展)
  8. mysql median_MySQL中查询中位数?
  9. 傻瓜式学Python3——列表
  10. 《MATLAB金融算法分析实战》之量化投资趋向指标1— python实现
  11. JavaScript(WebAPI) (前端)
  12. Andrew Ng 机器学习鸡尾酒音频分离算法解析
  13. 安卓车机系统adb shell cmd 源码原理分析
  14. Silverlight资源概述
  15. 什么是GC root ,GC root原理
  16. TOMCAT中文乱码问题解决
  17. Dynamic TCP Initial Windows and Congestion Control Schemes through Reinforcement Learning笔记
  18. 机器入门必修:国际名校机器学习课程书籍推荐
  19. android 微信 联系人,android高仿微信联系人选择
  20. [SAE] [FC] 阿里云 Serverless 产品横行对比: 应用引擎与函数计算

热门文章

  1. 减轻近视度数的真实有效方法
  2. RTKLIB中伪距单点定位的函数(一)
  3. SimpleFOC移植STM32(七)—— 移植STM32F405RGT6
  4. lg空调代码大全解决_LG空调故障代码大全31905
  5. 华为手机老是android自动升级,华为手机优化:关闭自动更新
  6. MegaRAID管理磁盘
  7. 部分声纳波形模糊函数MATLAB仿真
  8. 第11章 时间序列--Python for Data Analysis 2nd
  9. 关于使用Xstream转换java对象时遇到的错误
  10. Verilog——多路选择器逻辑设计