数据库中Select For update语句的解析

数据库中Select For update语句的解析,第1张

他们已经说了相关的东西了

我再补充几点:

分成两类:加锁范围子句和加锁行为子句

加锁范围子句:

在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁 *** 作。默认情况下,不使用of子句表示在select所有的数据表中加锁

加锁行为子句:

当我们进行for update的 *** 作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。

在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。

For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。

那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备。

Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句。

该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。

1、首先打开SQL Server Management管理工具,使用sql语句创建一张测试表。

2、在测试表中,插入3条测试数据。

3、使用一条语句批量修改整个表的数据。

4、使用一条语句批量修改指定条数的记录。

5、使用一条语句批量修改这三条数据(按条件修改值)。

6、使用一条语句批量修改数据,使用where和case when。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9943178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存