delete未提交rollback是否会改变行号

今天做个试验,delete未提交rollback是否会改变行号?

创建测试表:
create table dxmy (id number,name varchar2(100));

插入数据
insert into dxmy values(1,'dxmy');
insert into dxmy values(2,'dxmy');
insert into dxmy values(3,'dxmy');
insert into dxmy values(4,'dxmy');
commit;

查看行号
SQL> select dbms_rowid.rowid_relative_fno(rowid) fno,
  2         dbms_rowid.rowid_block_number(rowid) block_id,
  3         dbms_rowid.rowid_row_number(rowid) row_id,
  4         id
  5    from dxmy;
 
       FNO   BLOCK_ID     ROW_ID         ID
---------- ---------- ---------- ----------
         4        462          0          1
         4        462          1          2
         4        462          2          3
         4        462          3          4 

delete,但是不提交:
SQL> delete dxmy where id = 1;
 
1 row deleted
 
SQL>
SQL> select dbms_rowid.rowid_relative_fno(rowid) fno,
  2         dbms_rowid.rowid_block_number(rowid) block_id,
  3         dbms_rowid.rowid_row_number(rowid) row_id,
  4         id
  5    from dxmy;
 
       FNO   BLOCK_ID     ROW_ID         ID
---------- ---------- ---------- ----------
         4        462          1          2
         4        462          2          3
         4        462          3          4

rollback:
SQL> rollback;
 
Rollback complete

SQL> select dbms_rowid.rowid_relative_fno(rowid) fno,
  2         dbms_rowid.rowid_block_number(rowid) block_id,
  3         dbms_rowid.rowid_row_number(rowid) row_id,
  4         id
  5    from dxmy;
 
       FNO   BLOCK_ID     ROW_ID         ID
---------- ---------- ---------- ----------
         4        462          0          1
         4        462          1          2
         4        462          2          3
         4        462          3          4

行号未改变。

那如果delete之后,我提交了,然后重新插入呢?
SQL> delete dxmy where id = 1;
 
1 row deleted
 
SQL> commit;
 
Commit complete
SQL> insert into dxmy values(1,'dxmy');
 
1 row inserted
 
SQL> commit;
 
Commit complete

SQL> select dbms_rowid.rowid_relative_fno(rowid) fno,
  2         dbms_rowid.rowid_block_number(rowid) block_id,
  3         dbms_rowid.rowid_row_number(rowid) row_id,
  4         id
  5    from dxmy;
 
       FNO   BLOCK_ID     ROW_ID         ID
---------- ---------- ---------- ----------
         4        462          1          2
         4        462          2          3
         4        462          3          4
         4        463          0          1

<pre name="code" class="html">SQL> delete dxmy where id = 1;
 
1 row deleted
 
SQL> commit;
 
Commit complete

SQL> insert into dxmy values(1,‘dxmy2‘);

1 row inserted

SQL> commit;

Commit complete

SQL>

SQL> select dbms_rowid.rowid_relative_fno(rowid) fno,

2         dbms_rowid.rowid_block_number(rowid) block_id,

3         dbms_rowid.rowid_row_number(rowid) row_id,

4         id

5    from dxmy;

FNO   BLOCK_ID     ROW_ID         ID

---------- ---------- ---------- ----------

4        462          1          2

4        462          2          3

4        462          3          4

4        463          1          1

然后就发现:

1.delete未提交即rollback不会改变行号

2.delete提交后插入数据,可能会改变行号,但是也有可能不改变,但行的位置肯定会改变。

				
时间: 2024-10-26 17:17:16

delete未提交rollback是否会改变行号的相关文章

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中的事务概念,ACID 原则,事务中常见的问题,问题造成的原因和事务隔离级别等这些方面的知识好好的整理了一下. 其实有关 SQL Server 中的事务,说实话因为内容太多, 话题太广,稍微力度控制不好就超过了我目前知识能力范围,就不是三言两语能够讲清楚的.所以希望大家能够指出其中总结的不足之处,对我

SQL Server查詢未提交事務,終止進程,解除表鎖

如果數據庫中有未提交的事務,相關表將一直處於死鎖狀態,從而影響其他進程的查詢(除非在查詢中用with (nolock)). 由於事務的隔離性,其他Session無法簡單通過RollBack Transaction來回滾事務,只能終止未提交事務所在會話的進程,然後由於事務的原子性,終止其進程,事務也就回滾了. 如何找出未提交的事務呢 運行如下命令: DBCC OpenTran 結果如下: SPID即進程ID,再運行如下命令,終止進程即可: kill 52 -- 52就是未提交事務會話所在SPID

数据库隔离级别,读已提交,读未提交

同样是后端开发,年薪50万和年薪20万的差距在哪里>>> 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. √: 可能出现    ×: 不会出现 事务的隔离级别 脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed--Sql Server , Oracle × √ √ Re

数据库事务隔离级别--读未提交,读已提交,重复读,序列化

参考原文:https://my.oschina.net/bigdataer/blog/1976010 上一篇文章讲述了:数据库主从复制,那么新的问题数据库读写分离对事物是否有影响? 1. 名词 读未提交read-uncommited 读已提交read-commited 重复读repeatable-->可能产生主从数据不一致问题 串行化serializable-->特殊场景-秒杀使用,一般不用 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committe

曲苑杂坛--DML操作中如何处理那些未提交的数据

对数据库稍有了解的人,数据库使用排他锁X锁来避免两个事务同时修改同一条数据,同时使用较低级别如行上加锁来提高并发度. 以下了两种场景很容易理解: 1>事务1执行 UPDATE TB1 SET C2=1 WHERE C1=1(此处假设C1为主键,使用行锁),事务1未提交,而后事务2执行UPDATE TB1 SET C2=2 WHERE C1=1,事务2必须等到事务1提交或回滚后,才能获得对该行数据的X锁: 2>事务1执行 UPDATE TB1 SET C2=1 WHERE C1=1(此处假设C1

事务隔离级别区分,未提交读,提交读,可重复读

事务隔离超通俗好懂的的讲解 按照隔离的级别由低到高,越高的隔离,效率越差 0).DEFAULT 默认隔离级别,由数据库的数据隔离级别确定隔离级别       1).READ_UNCOMMIYTTED 都未提交的 级别最低             允许别的事务,去读取这个事务为提交之前的数据             缺点:可能会造成脏读.幻读.不可重复读.             例子讲解:店家对1000元商品进行降价500处理,数据更改,但未提交事务:             然后你查到降价将货

同一个事务里 查询 已删除但是未提交的数据[bug记录]

前几天犯了个低级错误,在一个事务方法里老是查询不到某条记录,但是debug卡住时,用db工具查,又能查出值. 经过一番折腾,原来是我在同一个事务里 查询 了已删除但是未提交的数据,当然查询不到了!!! 情况是这样的: Service层(spring事务管理配置在这一层,此方法配了PROPAGATION_REQUIRED)有个方法function m()写得很长, 其中有2步是 1. delete from B where objectid ='TestB' 2. select * from A

找出未提交的MySQL线程/事务

找出未提交的MySQL线程/事务: SELECT trx_id,trx_state,trx_started,trx_mysql_thread_id,CURRENT_TIMESTAMP - trx_started AS RUN_TIME from information_schema.innodb_trx; SELECT * from information_schema.processlist;   这个能看到上面哪个SQL线程ID(下图的378号线程就是造成MDL锁的罪魁祸首) SELECT

git如何删除本地所有未提交的更改

位于分支 develop 您的分支与上游分支 'origin/develop' 一致. 未跟踪的文件: (使用 "git add <file>..." 以包含要提交的内容) :all :crm_overview :fm_overview :oa_overview :pm_overview dashboard#index git checkout . && git clean -xdf git如何删除本地所有未提交的更改,布布扣,bubuko.com