今天,运行Java后台程序,设置了断点,每到执行SQL语句时,就卡住,执行检查,发现SQL语句并没有问题,程序没没问题,于是把语句拷贝到PL/SQL里面执行,发现还是语句执行了很久都没有结果,于是我中断执行,我使用的是Update语句。
于是我就直接在上面改字段,在点打钩(记入改变)的时候提示,记录被另一个用户锁住,一开始还以为整个表被锁住了,后来发现,仅仅是这个字段不能改变,其他的字段可以。
网上找了资料,发现是:当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况造成的。网上也给出了答案:
1、查看数据库锁,诊断锁的来源及类型:
select object_id,session_id,locked_mode from v$locked_object;
或者用以下命令:
select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id
SELECT lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
2、找出数据库的serial#,以备杀死:
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
3、杀死该session
alter system kill session 'sid,serial#'
用步骤2中查出来的记录,对应进该语句删除
就是这样子,以下是我操作的方法:
第一步:(只是用于查看哪些表被锁住,真正有用的是第二、第三步)
select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id
后:
OWNER OBJECT_NAME SESSION_ID LOCKED_MODE
1 BSZCGL TDISPOSE_ACCEPT_F 1115 3
2 BSZCGL TDISPOSE_ACCEPT_F 1097 3
3 BSZCGL TDISPOSE_ACCEPT_Z 1116 3
4 BSZCGL TDISPOSE_ACCEPT_Z 1111 3
5 BSZCGL TDISPOSE_ACCEPT_Z 1103 3
6 BSZCGL TDISPOSE_ACCEPT_Z 1100 3
7 BSZCGL TDISPOSE_ACCEPT_Z 1097 3
8 BSZCGL TDISPOSE_ACCEPT_Z 1092 3
9 BSZCGL TDISPOSE_DAMAGE_Z 1106 3
10 BSZCGL TZC6_22CL 1097 3
可以看出,那些表被锁住
第二步:
select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;
后:
USERNAME SID SERIAL# LOGON_TIME
1 BSZCGL 1115 132 2011-12-6 14:51:35
2 BSZCGL 1097 116 2011-12-6 14:51:57
3 BSZCGL 1097 116 2011-12-6 14:51:57
4 BSZCGL 1097 116 2011-12-6 14:51:57
5 BSZCGL 1111 155 2011-12-6 14:56:29
6 BSZCGL 1103 292 2011-12-6 14:57:34
7 BSZCGL 1116 388 2011-12-6 15:04:56
8 BSZCGL 1100 240 2011-12-6 15:08:13
9 BSZCGL 1106 228 2011-12-6 15:26:20
10 BSZCGL 1092 10 2011-12-6 15:26:46
第三步:(关键)
执行:(alter system kill session 'sid,serial#')具体如下:
alter system kill session '1115,132'
alter system kill session '1097,116'
alter system kill session '1111,155'
alter system kill session '1103,292'
alter system kill session '1116,388'
alter system kill session '1100,240'
alter system kill session '1106,228'
alter system kill session '1092,10'
执行成功,会提示执行完毕!
有可能执行完一条之后,其他的ID也跟着消失,执行完3后,在执行2,检查时候清除完毕
相关推荐
### PLSQL中记录被另一个用户锁住的原因及处理方法 #### 背景与概念 在数据库管理系统(DBMS)中,多个用户或应用程序可能同时访问相同的数据资源。为了确保数据的一致性和完整性,数据库系统通常会采用锁机制来...
在Oracle数据库环境中,当尝试删除数据时遇到“记录被另一个用户锁住”的错误,这通常是由于并发事务控制机制导致的。Oracle使用了一种称为多版本并发控制(MVCC)的机制来确保数据的一致性和完整性,其中包括行级...
本文将深入探讨Oracle数据库中“记录被另一个用户锁住”的原因以及解决方法。 首先,理解为什么会出现记录被锁住的情况至关重要。在多用户环境下,数据库必须确保事务的隔离性,以防止并发操作导致的数据不一致。...
1、先来看看为什么会出锁住: 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏...
在Oracle数据库中,当多个用户尝试同时更新同一数据记录时,可能会出现锁定冲突的问题。这种情况下,如果一个用户的事务已经锁定了某些记录,而其他用户试图修改这些记录,则后者将不得不等待,直到前者的事务完成或...
在Oracle中删除表中的重复数据,可以采用多种策略,但通常涉及创建一个临时表来保存去重后的数据,然后用这个临时表覆盖原始表。这种方法可以避免直接修改原表带来的风险,确保操作的安全性。以下是一种具体的实现...
2. 行(Row):行是表中的数据记录,包含表中所有列的值。Oracle使用行标识符(ROWID)来唯一标识每一行。 3. 列(Column):列定义了表中的字段,每个列都有一个名字、数据类型和可能的约束条件,如非空(NOT NULL...
Oracle 9i 是一个功能强大的关系型数据库管理系统,在企业级应用中非常广泛。数据字典在 Oracle 9i 中扮演着极其重要的角色,它不仅提供了对数据库对象的基本管理,还为高级功能如性能监控和故障诊断提供了支持。 #...
然而,在多用户并发访问的环境下,存储过程可能会因为某些操作而被锁定,导致其他进程无法访问或修改该存储过程,从而引发一系列问题,如应用程序挂起、数据库性能下降等。 ### 描述:“如果存储过程被锁住,可以...
Consistent 方式是专门解决这个问题的,它在处理父表前首先锁定主表和子表需要复制的记录,在增量数据复制时,插入主表和子表的新增量数据都会被本次抽取过程忽略,放在下次抽取时处理。 ODI 通过 LogMiner 技术...
这种方法通过创建一个包含唯一记录的临时表,再将数据插入到原表中,最后删除临时表。具体步骤如下: 1. 创建一个临时表`demo2`,并从中选择唯一的记录。 2. 清空原表`demo`。 3. 将`demo2`中的数据重新插入到`demo...
为了快速地诊断出锁住资源的用户,并解决其锁定问题,需要使用 Oracle 数据库提供的一些视图和表。例如,v$session 视图和 v$lock 视图。这些视图提供了锁定的信息,例如锁定的类型、锁定的资源、锁定的用户等。 ...
在Oracle SQL中,删除重复数据并保留最新日期的实例是一个常见的数据清理任务,尤其是在具有历史记录或事务数据的数据库中。这个实例展示了如何通过SQL查询有效地处理这种情况。在这个例子中,我们有一个名为`abc`的...
4. **UNDO表空间管理**:Oracle通过UNDO表空间管理来记录事务的更改前状态,这样即使在长时间运行的事务中也能保持数据一致性,同时减少了锁定的需要。 #### 具体示例分析 假设在一个部门中有两个员工正在同时更新...
假设我们有一个名为 `EMPLOYEE` 的表,并希望获取有关其空间使用情况的信息,我们可以从数据字典中查询以下信息: 1. **表的基本信息**:通过查询 `ALL_ALL_TABLES` 表,了解表所属的表空间、是否属于某个簇或索引...
Oracle Streams 是一个高级的数据集成解决方案,它能够捕获并应用数据库中的变化,从而实现数据在多个Oracle数据库之间的复制与同步。这一功能对于分布式环境下的数据共享至关重要,尤其是在需要实时数据更新或跨...
首先,Oracle数据块由多个部分组成,主要包括: 1. 头部(Header):数据块头部包含了关于数据块本身的信息,如数据块号、块状态、块的所有者、以及用于锁定和并发控制的头部字段。这些信息对于数据库操作的正确性...
例如,两个用户同时尝试更新同一条记录,如果没有适当的锁机制,可能会导致其中一个用户的更改被另一个用户的更改覆盖,从而丢失数据。因此,锁是并发控制的核心组成部分。 #### 三、Oracle中的锁分类 Oracle中的锁...
**批量提交**是指在一个事务中同时提交多条记录的更改操作,而不是每条记录都单独提交一次。这种技术在处理大数据量时尤其有用,因为它减少了网络流量和事务日志的开销,从而提高了数据库的整体性能。 - **减少网络...