什么是sql的for update
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相关推荐
- 【转载】SQL中使用update inner join和delete inner join
原文地址:SQL中使用update inner join和delete inner join Update XXX set XXX where 这种写法大家肯定都知道,才发现update和delete ...
- SQL Server 中update的小计
update中涉及到多个表的: 1.update TableA set a.ColumnC=b.ColumnC from TableA a inner join TableB b on a.Colum ...
- centos写mysql光标移到上一行_mysql:一条SQL更新语句(update)是如何执行的
一条更新语句的执行流程又是怎样的呢? 之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢? 我们还是从一个表的一条更新语 ...
- 根据指定字段排序编号(SQL Server 2005,Update,Order By)
在SQL Server 2005可以通过with as根据指定的字段排序编号,SQL语句如下: WITH 表1 AS ( SELECT 编号字段名, ROW_NUMBER() OVER(ORDER B ...
- SQL Server 创建update、delete触发器实例
这学期刚刚学数据库,上课的时候老师主要讲的是理论.但是上机时需要实操写SQL语句,便觉得十分困难.数据库小白在大量的文章中搜索,发现许多文章对于小白来说非常不友好(maybe是笔者道行还不深),花了一 ...
- SQL跨库UPDATE
查看班级信息 SELECT * FROM [dbo].[ClassDemo] 查看学生信息 SELECT * FROM [dbo].[StudentDemo] 由于原来班级名是"班级a&qu ...
- 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 ...
- mysql 触发器 sql日志_sql update 触发器 可获得被update的行的信息
SQL Server 2005 学习笔记之触发器简介[转] 触发器实际上就是一种特殊类型的存储过程,其特殊性表现在:它是在执行某些特定的T-SQL语句时自动的. 11.1 触发器简介 触发器实际上就是 ...
- 【SQL】 delete update中使用inner join
Update Update XXX set XXX where 这种写法大家肯定都知道,update和delete支持inner join的update方式,这个在表间关联来做更新和删除操作非常有用 ...
- sql insert and update
1 二者的区别 insert是插入一条新的数据,它会创建一条新的记录:update是更新一条已经有的数据,它不会创建新的记录. update需要where来指示更新那条记录,否则会更新所有的记录. 2 ...
最新文章
- C++文件输入和输出
- 5G多输入多输出技术,到底是个啥东东?
- centos安装python3.8与pip
- ubuntu虚拟机进程被杀死_Linux进程被杀掉(OOM killer),查看系统日志
- Scheme报错define-values: assignment disallowed; cannot change constant
- win10跳过计算机密码,Win10怎么取消开机密码?Win10如何跳过开机密码?
- 斐讯 k3 设置 虚拟服务器,斐讯K3无线中继设置教程(无线扩展)
- mysql median_MySQL中查询中位数?
- 傻瓜式学Python3——列表
- 《MATLAB金融算法分析实战》之量化投资趋向指标1— python实现
- JavaScript(WebAPI) (前端)
- Andrew Ng 机器学习鸡尾酒音频分离算法解析
- 安卓车机系统adb shell cmd 源码原理分析
- Silverlight资源概述
- 什么是GC root ,GC root原理
- TOMCAT中文乱码问题解决
- Dynamic TCP Initial Windows and Congestion Control Schemes through Reinforcement Learning笔记
- 机器入门必修:国际名校机器学习课程书籍推荐
- android 微信 联系人,android高仿微信联系人选择
- [SAE] [FC] 阿里云 Serverless 产品横行对比: 应用引擎与函数计算