1. sql Server如何查看被锁的表及解锁的方法
查询sys.syslockinfo表可以看到哪些表被锁了,req_spid是进程
可以用kill杀死相关进程
2. 怎样用SQL给SQL2880特定表加锁解锁
加锁的语句如下:
SELECT*FROM表名WITH(TABLOCK);
这里没有解锁的概念,只有不加锁的概念,语句如下:
SELECT*FROM表名WITH(NOLOCK);
加锁的解释:
TABLOCK(表锁)
此选项被选中时,SQLServer将在整个表上置共享锁直至该命令结束。这个选项保证其他进程只能读取而不能修改数据。
不加锁的解释:
NOLOCK(不加锁)
此选项被选中时,SQLServer在读取或修改数据时不加任何锁。在这种情况下,用户有可能读取到
3. 如何将数据库中被锁表解锁
在操作数据库的时候,有时候会由于操作不当引起数据库表被锁定,这么我们经常不知所措,不知怎么给这些表解锁,在pl/sql Developer工具的的菜单“tools”里面的“sessions”可以查询现在存在的会话,但是我们很难找到那个会话被锁定了,想找到所以被锁的会话就更难了,下面这叫查询语句可以查询出所以被锁的会话。如下:
SELECT sn.username, m.SID,sn.SERIAL#, m.TYPE,
DECODE (m.lmode,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
lmode, LTRIM (TO_CHAR (lmode, '990'))
) lmode,
DECODE (m.request,
0, 'None',
1, 'Null',
2, 'Row Share',
3, 'Row Excl.',
4, 'Share',
5, 'S/Row Excl.',
6, 'Exclusive',
request, LTRIM (TO_CHAR (m.request, '990'))
) request,
m.id1, m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在锁请求,即被阻塞
OR ( sn.SID = m.SID --不存在锁请求,但是锁定的对象被其他会话请求锁定
AND m.request = 0
AND lmode != 4
AND (id1, id2) IN (
SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0 AND s.id1 = m.id1
AND s.id2 = m.id2)
)
ORDER BY id1, id2, m.request;
通过以上查询知道了sid和 SERIAL#就可以开杀了
alter system kill session 'sid,SERIAL#';
4. SQL Server表锁定原理以及如何解除锁定
1. 数据库表锁定原理
1.1 目前的C/S,B/S结构都是多用户访问数据库,每个时间点会有成千上万个user来访问DB,其中也会同时存取同一份数据,会造成数据的不一致性或者读脏数据.
SELECT
request_session_idasSpid,
Coalesce(s.name+'.'+o.name+isnull('.'+i.name,''),
s2.name+'.'+o2.name,
db.name)ASObject,
l.resource_typeasType,
request_modeasMode,
request_statusasStatus
FROMsys.dm_tran_locksl
LEFTJOINsys.partitionsp
ONl.resource_associated_entity_id=p.hobt_id
LEFTJOINsys.indexesi
ONp.object_id=i.object_id
ANDp.index_id=i.index_id
LEFTJOINsys.objectso
ONp.object_id=o.object_id
LEFTJOINsys.schemass
ONo.schema_id=s.schema_id
LEFTJOINsys.objectso2
ONl.resource_associated_entity_id=o2.object_id
LEFTJOINsys.schemass2
ONo2.schema_id=s2.schema_id
LEFTJOINsys.databasesdb
ONl.resource_database_id=db.database_id
WHEREresource_database_id=DB_ID()
ORDERBYSpid,Object,CASEl.resource_type
When'database'Then1
when'object'then2
when'page'then3
when'key'then4
Else5end
5. 用SQL如何给DB2表加锁和解锁
在DB2的命令行中输入:
update monitor switches using lock on table on
然后打开另一个DB2命令窗口执行我的那个被吊死的Update语句。
然后在第一个DB2命令窗口执行: [@more@]get snapshot for locks on Database_Name(你的数据库的名字)> locks.TXT
然后,可以看到第一个DB2的窗口有一个信息输出,把这些信息输出到TXT中,大致如下:
应用程序句柄 = 36
应用程序标识 = AC100C47.IC05.00F6C6095828
序号 = 0246
应用程序名 = java.exe
CONNECT 授权标识 = DB2ADMIN
应用程序状态 = UOW 正在等待
状态更改时间 = 未收集
应用程序代码页 = 1208
挂起的锁定 = 0
总计等待时间(毫秒) = 0
应用程序句柄 = 43
应用程序标识 = *LOCAL.DB2.060512054331
序号 = 2273
应用程序名 = java.exe
CONNECT 授权标识 = DB2ADMIN
应用程序状态 = 联合请求暂挂
状态更改时间 = 未收集
应用程序代码页 = 1208
挂起的锁定 = 6
总计等待时间(毫秒) = 0
锁定列表
锁定名称 = 0x031F9052000000000000000055
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 255
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部
方式 = S
锁定名称 = 0x26800000000000000000000044
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部
方式 = S
锁定名称 = 0x020006000F1700000000000052
锁定属性 = 0x00000000
发行版标志 = 0x00000001
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 5903
对象类型 = 行
表空间名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = NS
锁定名称 = 0x01000000010000000500BC0056
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部变化锁定
方式 = S
锁定名称 = 0x535953534E333030FD965C0641
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部方案锁定
方式 = S
锁定名称 = 0x02000600000000000000000054
锁定属性 = 0x00000000
发行版标志 = 0x00000001
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 6
对象类型 = 表
表空间名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = IS
应用程序句柄 = 557
应用程序标识 = *LOCAL.DB2.060512053913
序号 = 1254
应用程序名 = java.exe
CONNECT 授权标识 = DB2ADMIN
应用程序状态 = 联合请求暂挂
状态更改时间 = 未收集
应用程序代码页 = 1208
挂起的锁定 = 6
总计等待时间(毫秒) = 0
锁定列表
锁定名称 = 0x031F9052000000000000000055
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 255
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部
方式 = S
锁定名称 = 0x26800000000000000000000044
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部
方式 = S
锁定名称 = 0x02000600071D00000000000052
锁定属性 = 0x00000000
发行版标志 = 0x00000001
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 7431
对象类型 = 行
表空间名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = NS
锁定名称 = 0x01000000010000000500BC0056
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部变化锁定
方式 = S
锁定名称 = 0x535953534E333030FD965C0641
锁定属性 = 0x00000000
发行版标志 = 0x40000000
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 0
对象类型 = 内部方案锁定
方式 = S
锁定名称 = 0x02000600000000000000000054
锁定属性 = 0x00000000
发行版标志 = 0x00000001
锁定计数 = 1
挂起计数 = 0
锁定对象名 = 6
对象类型 = 表
表空间名 = USERSPACE1
表模式 = DB2ADMIN
表名 = C_USER
方式 = IS
其中应用程序句柄43和557的状态都是死锁了,猜测是这2个应用争用DB2的表,造成死锁,根据日志提示,在DB2的命令窗口输入:
force application (43)
force application (557)
提示这个操作是异步的,我执行list applicaions,结果进程中还有那2个进程,那2个进程可能是在执行比较大的操作,需要耐心等待,如何还不行,则使用下面的命令来强制所有的应用都停止,然后重启DB2:
force application all
terminate
db2stop force
db2start
如果DB2在Window上,则可以使用“控制中心”->实例->右键“应用程序”,可以看到当前的锁定情况,并且可以强行关闭某个进程,也可以显示“锁定链”。
6. oracle 锁表、解锁的语句
1.正确方法用 select xxx from table for update; <- 锁表
直接用update table set xxx的话,只能锁row
不要commit的意思是不提交该transaction。若commit或rollback,则释放所有lock资源
2.commit = confirm 确认并提交该次会话中的修改
rollback = cancel 取消该次会话
7. MySQL数据库如何锁定和解锁数据库表
第一步,创建数据库表writer和查看表结构,利用SQL语句:
create table writer(
wid int(10),
wno int(10),
wname varchar(20),
wsex varchar(2),
wage int(2)
第二步,向数据库表writer插入五条数据,插入后查看表里数据
第三步,利用锁定语句锁定数据库表writer,利用SQL语句:
lock table writer read;
让数据库表只读不能进行写
第四步,为了验证锁定效果,可以查看数据库表数据,利用SQL语句:
select * from writer;
第五步,利用update语句对id=5进行更新,SQL语句为:
update writer set wname = '胡思思' where id = 5;
第六步,利用unlock进行解锁,SQL语句为:
unlock tables;
8. sql server怎样给一个数据库加锁和解锁
加锁的语句如下:
1
SELECT * FROM 表名 WITH (TABLOCK);
这里没有解锁的概念,只有不加锁的概念,语句如下:
1
SELECT * FROM 表名 WITH (NOLOCK);
加锁的解释:
TABLOCK(表锁)
此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。
不加锁的解释:
NOLOCK(不加锁)
此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到
9. oracle锁表如何解锁
自己本地的库的话,重启数据库就好了。自动回滚,重要数据库不可以重启的话,查到用户会话的sid和serial#然后kill