PLSQL中记录被另一个用户锁住的原因及处理方法

PLSQL中记录被另一个用户锁住的原因及处理方法,第1张

PL/SQL中记录被另一个用户锁住的原因:另一个用户正在修改或删除该记录。此时其它用户只能做查询,不能进行删改 *** 作。如果要解锁,正在删改 *** 作的用户退出删改状态即可。

因死机或挂起不能退出删改状态时,找到该用户的进程,kill该进程就可以了。实在不行的话重新启动数据库也可以。

处理方法:

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

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#'

扩展资料

SQL Server中的锁类型及用法:

从数据库系统的角度来看:分为独占锁(即排它锁), 共享锁和更新锁。MS-SQL Server使用以下资源锁模式。

锁模式描述:

共享(S)用于不更改或不更新数据的 *** 作(只读 *** 作),如SELECT语句。

更新(U)用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。

排它(X)用于数据修改 *** 作,例如.INSERT、UPDATE 或DELETE。确保不会同时同一资源进行多重更新。

意向锁用于建立锁的层次结构。意向锁的类型为:意向共享(IS)、意向排它(IX)以及与意向排它共享(SIX)。

架构锁在执行依赖于表架构的 *** 作时使用。架构锁的类型为:架构修改(Sch-M)和架构稳定性(Sch-S)。

大容量更新(BU)向表中大容量复制数据并指定了TABLOCK提示时使用。

recordset的open语句后边的参数就可以控制

RS.OPEN SQL,CONN,A,B

A:

ADOPENFORWARDONLY(=0)

只读,且当前数据记录只能向下移动

ADOPENKEYSET(=1)

只读,当前数据记录可自由移动

ADOPENDYNAMIC(=2)

可读写,当前数据记录可自由移动

ADOPENSTATIC(=3)

可读写,当前数据记录可自由移动,可看到新增记录

B:

ADLOCKREADONLY(=1)

缺省锁定类型,记录集是只读的,不能修改记录

ADLOCKPESSIMISTIC(=2)

悲观锁定,当修改记录时,数据提供者将尝试锁定记录以确保成功地编辑记录。只要编辑一开始,则立即锁住记录。

ADLOCKOPTIMISTIC(=3)

乐观锁定 ,直到用Update方法提交更新记录时才锁定记录。

ADLOCKBATCHOPTIMISTIC(=4)

批量乐观锁定,允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。

当不需要改动任何记录时,应该使用只读的记录集,这样提供者不用做任何检测。

对于一般的使用,乐观的锁定可能是最好的选择,因为记录只被锁定一小段时间,

数据在这段时间被更新。这减少了资源的使用。

当年我在这里也走了不少弯路,查了很多资料才发现问题很简单,下面就轻松实现锁定与解锁.

窗体页眉中新建一个复选框或单选框,这里我用的是复选框(我取的名叫ChkLock),下面是这个复选框的单击事件

Private Sub ChkLock_Click()

Dim ctl As Control

For Each ctl In Me.Section(0).Controls 'Section(0)是主体的意思

If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acCheckBox Then

'或用类似下面这句

'If ctl.Name <> "ChkLock" And ctl.Name <> "TxtFind" And ctl.ControlType <> acLabel Then

ctl.Locked = Me.ChkLock '这里就是实现锁定或解锁

End If

Next

End Sub

上面实现锁定的代码,下面实现自动锁定,不管你有没有忘记.利用窗体的Current事件(成为当前事件),如果要新建记录要自动解锁

Private Sub Form_Current()

'检查是否要锁定

If Me.NewRecord Then  '如果是新建状态就可以编辑(将勾取消)

Me.ChkLock = False

Else

Me.ChkLock = True

End If

Call ChkLock_Click  '调用复选框的单击事件,在这里变成子程序

End Sub

最好把这个控制锁定的复选框放在窗体页眉上,不然连它都锁定了就没法解锁了.

附:

'Section(0)是主体的意思,这里就是指循环主体上的控件,页脚页眉上的控件就影响不到了,如你要,Section(1)表示是窗体页眉Section(2)表示是窗体页脚

ControlType 属性是用于指定控件类型的固有常量。

常量                   控件

acBoundObjectFrame    绑定对象框

acCheckBox            复选框

acComboBox            组合框

acCommandButton       命令按钮

acCustomControl       ActiveX(自定义)控件

acImage               图像

acLabel               标签

acLine                线条

acListBox             列表框

acObjectFrame         未绑定对象框或图表

acOptionButton        选项按钮

acOptionGroup         选项组

acPage                页

acPageBreak           分页符

acRectangle           矩形

acSubform             子窗体/子报表

acTabCtl              选项卡

acTextBox             文本框

acToggleButton        切换按钮


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6425989.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-22
下一篇 2023-03-22

发表评论

登录后才能评论

评论列表(0条)

保存