什么是sql的forupdate
for update详解
⼀、for update的定义
⾸先我们要知道for update是⼀种⾏级锁,我们⼜叫排它锁,⼀旦⽤户对某个⾏施加了⾏级加锁,则该⽤户可以查询也可以更新被加锁的数据⾏,其它⽤户只能查询但不能更新被加锁的数据⾏.如果其它⽤户想更新该表中的数据⾏,则也必须对该表施加⾏级锁.即使多个⽤户对⼀个表均使⽤了共享更新,但也不允许两个事务同时对⼀个表进⾏更新,真正对表进⾏更新时,是以独占⽅式锁表,⼀直到提交或复原该事务为⽌。⾏锁永远是独占⽅式锁。
只有当出现如下之⼀的条件,才会释放共享更新锁:
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 引发的‘资源忙’异常报告

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。