By Jeff Hunter, ideveleopment.info
Script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
REM +-----------------------------------------------------------------+
REM | FILE    : user_transaction_information.sql                      |
REM | AUTHOR  : Jeff Hunter                                           |
REM | PURPOSE : List TABLE locking AND user transactions information. | 
REM +-----------------------------------------------------------------+
 
SET LINESIZE 145
SET PAGESIZE 66
 
COLUMN owner        FORMAT a5      HEADING 'Owner'
COLUMN object_type  FORMAT a10     HEADING 'Type'
COLUMN object_name  FORMAT a25     HEADING 'Name'
COLUMN locked_mode  FORMAT a9      HEADING 'Locked Mode'
COLUMN sid          FORMAT 999     HEADING 'SID'
COLUMN username     FORMAT a15     HEADING 'Database User'
COLUMN osuser       FORMAT a10     HEADING 'O/S User'
COLUMN logon_time                  HEADING 'Login Time'
 
Prompt +----------------------------------------------------+
Prompt | TABLE Locking Information                          |
Prompt +----------------------------------------------------+
 
SELECT
    SUBSTR(b.owner, 1, 8)           owner
  , b.object_type                   object_type
  , SUBSTR(b.object_name, 1, 18)    object_name
  , DECODE(a.locked_mode
             , 0, 'None'
             , 1, 'Null'
             , 2, 'Row-S'
             , 3, 'Row-X'
             , 4, 'Share'
             , 5, 'S/Row-X'
             , 6, 'Exclusive')      locked_mode
  , a.session_id                    sid
  ,a.oracle_username                username
  , a.os_user_name                  osuser
  , TO_CHAR(c.logon_time,'YYYY/MM/DD HH24:MI:SS') logon_time
FROM
    v$locked_object a
  , dba_objects b
  , v$session c
WHERE
      a.object_id  = b.object_id
  AND a.session_id = c.sid
ORDER BY
    b.owner
  , b.object_type
  , b.object_name
/
 
Prompt +----------------------------------------------------+
Prompt | User Transactions Information                      |
Prompt +----------------------------------------------------+
 
COLUMN "UserName" format a8
COLUMN "DB Sid" format 999999
COLUMN "Unix Pid" format 99999999
COLUMN "Trnx_start_time" format a19
COLUMN "Current Time" format a19
COLUMN "Elapsed(mins)" format 999999999.99
COLUMN "Undo Name" format a09
COLUMN "Used Undo Blks" format a13
COLUMN "Used Undo Size(Kb)" format a17
COLUMN "Logical I/O(Blks)" format 99999999999999999
COLUMN "Logical I/O(Kb)" format 999999999999999
COLUMN "Physical I/O(Blks)" format 999999999999999999
COLUMN "Physical I/O(Kb)" format 999999999999999999
 
SELECT
    a.username  "UserName"
  , a.sid       "DB Sid"
  , e.spid      "Unix Pid"
  , TO_CHAR(TO_DATE(b.start_time,'mm/dd/yy hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') "Trnx_start_time"
  , TO_CHAR(sysdate,'yyyy/mm/dd hh24:mi:ss') "Current Time"
  , ROUND(60*24*(sysdate-to_date(b.start_time,'mm/dd/yy hh24:mi:ss')),2) "Elapsed(mins)"
  , c.segment_name "Undo Name"
  , TO_CHAR(b.used_ublk*d.value/1024) "Used Undo Size(Kb)"
  , TO_CHAR(b.used_ublk) "Used Undo Blks"
  , b.log_io "Logical I/O(Blks)"
  , b.log_io*d.value/1024 "Logical I/O(Kb)"
  , b.phy_io "Physical I/O(Blks)"
  , b.phy_io*d.value/1024 "Physical I/O(Kb)"
  , a.program 
FROM
    v$session         a
  , v$transaction     b
  , dba_rollback_segs c
  , v$parameter       d
  , v$process         e
WHERE
      b.ses_addr = a.saddr
  AND b.xidusn   = c.segment_id
  AND d.name     = 'db_block_size'
  AND e.ADDR     = a.PADDR
ORDER BY 4
/

Note:
In addition to an explicit LOCK SQL command run on the table (as Jonathan pointed out), another possibility of having a lock without a transaction is a DML with a long-running query as its prerequisite, such as
INSERT INTO YOURTABLE SELECT COLUMNS FROM SOMEBIGTABLE This immediately creates a TM lock in mode 3 on YOURTABLE, but won’t create a transaction until the query phase is finished.
When you have this problem, check v$sql.sql_text for the locking session and also its entry in v$session_wait.

Popularity: 21% [?]