Oracle11g oracle中的update语句是否在没有更新行的情况下保持锁定

Oracle11g oracle中的update语句是否在没有更新行的情况下保持锁定,oracle11g,Oracle11g,如果我在oracle中运行一个update语句,该语句说“0行已更新”,因为它与where子句不匹配,并且我没有提交,那么它是否仍然持有表中任何保护的锁?我的猜测是否定的,但我无法证明这一点。在没有更新任何内容的更新之后,不会持有行锁(毕竟,如果没有行,应该锁定哪一行?) 您的事务仍将有一些共享锁(在表上),但这些锁仅用于防止其他事务更改表。它基本上与select语句在表上获得的“锁”类型相同 : 只有当写入程序修改某行时,该行才会被锁定 : 行锁,也称为TX锁,是表的单行上的锁。事务为修改的每

如果我在oracle中运行一个update语句,该语句说“0行已更新”,因为它与where子句不匹配,并且我没有提交,那么它是否仍然持有表中任何保护的锁?我的猜测是否定的,但我无法证明这一点。

在没有更新任何内容的更新之后,不会持有行锁(毕竟,如果没有行,应该锁定哪一行?)

您的事务仍将有一些共享锁(在表上),但这些锁仅用于防止其他事务更改表。它基本上与select语句在表上获得的“锁”类型相同

:

只有当写入程序修改某行时,该行才会被锁定

:

行锁,也称为TX锁,是表的单行上的锁。事务为修改的每一行获取一个行锁


因此,如果没有行被更改,就不会有锁。

在没有更新任何内容的更新之后,不会保留任何行锁(毕竟,如果没有行,应该锁定哪个行?)

您的事务仍将有一些共享锁(在表上),但这些锁仅用于防止其他事务更改表。它基本上与select语句在表上获得的“锁”类型相同

:

只有当写入程序修改某行时,该行才会被锁定

:

行锁,也称为TX锁,是表的单行上的锁。事务为修改的每一行获取一个行锁


因此,如果没有行被更改,就不会有锁。

它不持有任何锁

简单测试用例

  • 打开两个oracle会话(sqlplus或sqldeveloper或通过任何其他方式)
  • 更新表1 where子句(会话1)
  • 更新表1 where子句(第2课时)
  • 从session1提交(如果有表锁,那么应该挂起)
  • 从session2提交(如果存在表锁,则此语句将导致死锁)

  • 行锁定的条件相同(如果存在,两个会话将删除同一行)

    它没有任何锁

    简单测试用例

  • 打开两个oracle会话(sqlplus或sqldeveloper或通过任何其他方式)
  • 更新表1 where子句(会话1)
  • 更新表1 where子句(第2课时)
  • 从session1提交(如果有表锁,那么应该挂起)
  • 从session2提交(如果存在表锁,则此语句将导致死锁)
  • 行锁定的条件相同(如果存在,两个会话将删除同一行)

    作为:

    插入、更新、删除和选择的锁定特性。。。有关UPDATE语句,请参见以下内容:

    • 包含DML语句的事务在该语句修改的行上获取排他的行锁。在锁定事务提交或回滚之前,其他事务无法更新或删除锁定的行

    • 包含DML语句的事务不需要对子查询或隐式查询(例如WHERE子句中的查询)选择的任何行获取行锁。DML语句中的子查询或隐式查询保证在查询开始时保持一致,并且看不到它所属的DML语句的效果

    • 事务中的查询可以看到同一事务中以前的DML语句所做的更改,但不能看到在其自身事务之后开始的其他事务的更改

    • 除了必要的排他行锁之外,包含DML语句的事务在包含受影响行的表上至少获取行排他表锁。如果包含的事务已持有该表的共享、共享行独占或独占表锁,则不会获取行独占表锁。如果包含的事务已经持有行共享表锁,Oracle数据库会自动将该锁转换为行独占表锁

    表锁是在更新过程中保护表不受更改所必需的,如果更新未修改任何行,则这是唯一应用的锁

    如果语句对一行执行的更新不会导致该行发生任何更改(例如,对于出生日期已为空的行,设置出生日期=NULL),则仍会使用行锁。

    如下所示:

    INSERT、UPDATE、DELETE和SELECT…FOR UPDATE语句的锁定特性如下:

    • 包含DML语句的事务在该语句修改的行上获取排他的行锁。在锁定事务提交或回滚之前,其他事务无法更新或删除锁定的行

    • 包含DML语句的事务不需要对子查询或隐式查询(例如WHERE子句中的查询)所选的任何行获取行锁。DML语句中的子查询或隐式查询保证在查询开始时保持一致,并且不会看到它所属的DML语句的效果的

    • 事务中的查询可以看到同一事务中以前的DML语句所做的更改,但不能看到在其自身事务之后开始的其他事务的更改

    • 除了必要的排他行锁之外,包含DML语句的事务在包含受影响行的表上至少获取行排他表锁。如果包含该事务的事务已持有该表的共享、共享行排他或排他表锁,则不获取行排他表锁d、 如果包含的事务已经持有行共享表锁,Oracle数据库会自动将该锁转换为行独占表锁

    桌子锁是保护桌子的必要工具