碰到一个奇怪的事情
SQL> delete from test where name is null;
0 rows deleted.
SQL> select * from v$transaction;
no rows selected
SQL> select * from v$lock where sid=52;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
000000006EDCE090 000000006EDCE0E8 52 AE 100 0 4 0 2411 2
00007F2488B4A8B8 00007F2488B4A918 52 TM 88076 0 3 0 1536 2
疑似没有修改记录的dml语句在v$transaction没有记录,只持有一个3号TM锁。
再看一条正常的dml语句
SQL> delete from test where id=1;
1 row deleted.
SQL> select count(*) from v$transaction;
COUNT(*)
----------
1
SQL> select * from v$lock where sid=52;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
000000006EDCE090 000000006EDCE0E8 52 AE 100 0 4 0 2492 2
00007F2488B0DBC8 00007F2488B0DC28 52 TM 88076 0 3 0 19 2
000000006BCE1A40 000000006BCE1AB8 52 TX 262172 917 6 0 19 2
持有3号TM锁(行级排它锁)和6号TX锁。
官方对于v$transaction的定义
V$TRANSACTION
lists the active transactions in the system.
个人觉得,v$transaction这个视图的数据是从回滚段段头取得,没有修改记录的dml语句在回滚段段头没有事务记录,也就不在v$transaction中记录。但这样的语句也算是事务,因为ddl语句有的也没有tx锁,不产生undo数。ddl也是事务的一种。