oracle行锁和表锁
oracle行锁和表锁
·
oracle锁表
Oracle锁表是指在Oracle数据库中,某个事务正在使用或修改某个数据表时,其他事务无法访问或修改该表的一种机制。锁表是为了保证数据的一致性和完整性。
Oracle中的锁有多种类型,包括:
1. 共享锁(Shared Lock):多个事务可以同时获取该锁,但是只能读取数据,不能修改。
2. 排他锁(Exclusive Lock):只有一个事务可以获取该锁,可以读取和修改数据。
3. 行级锁(Row Lock):对表中的某一行进行加锁,其他事务只能等待该行解锁后才能进行操作。
4. 表级锁(Table Lock):对整个表进行加锁,其他事务不能对该表进行任何操作。
当一个事务获取了某个表的锁后,其他事务会被阻塞,直到该事务释放锁。如果一个事务长时间持有锁,可能会导致其他事务阻塞时间过长,影响系统的性能。
在实际应用中,需要合理使用锁,尽量减少锁的持有时间,避免出现死锁等问题。同时,Oracle也提供了一些锁的关键字和语句来进行锁的管理和控制,如:FOR UPDATE、FOR SHARE、NOWAIT、SELECT ... FOR UPDATE等。
行锁,是锁住具体某一个行或者几行,其他行的数据是可以增删改查的
如果添加where条件,只会锁行,这个和索引没有关系,都是锁行(oracle测试是这样)
update mysock set a=3 where id=1
更新,这是表锁,这个表都不能访问,很危险,没有条件就会锁整表,添加where就锁行
update mysock set a=3
删除,这是表锁,添加where就锁行
delete from mysock
查询,这是表锁,添加where就锁行
select * from mysock for update
新增不添加锁,不会锁行和表锁
insert新增(有唯一索引的字段),不会影响update和delete,会影响insert(唯一索引那个字段值相同才影响,值不同不影响)
开启2个plsql测试,同一个plsql的会话session相同,不受限制,所以要开2个plsql
新建一个表mysock,创建2个字段id和a
1、插入语句,字段无唯一索引,
第1个plsql
#不要提交commit
insert into mysock(id,a) values (3,3)
#同一个plsql中(同一个会话session)能查到新增未提交的数据
select id,a from mysock where id=3
第2个plsql
#不同session,查询不到,新增未提交的数据
select id,a from mysock where id=3
#更新成功
update mysock set a=11 where id=1
#删除成功
delete from mysock where id=2
#插入成功
insert into mysock(id,a) values (3,3)
2、插入语句,id字段为唯一索引
第1个plsql
#不要提交commit
insert into mysock(id,a) values (3,3)
第2个plsql
#正常更新
update mysock set a=3 where id=3
#正常删除
delete from mysock where id=3
#id不同,正常插入
insert into mysock(id,a) values (5,5)
#id相同,一直阻塞等待,直到上面提交commit或回滚
insert into mysock(id,a) values (3,333)
3、更新语句不带where条件
第1个plsql
#不要提交commit
update mysock set a=9
第2个plsql
#锁表,一直阻塞等待,直到上面提交commit或回滚
update mysock set a=1 where id=1
delete from mysock where id=2
#正常插入,不影响insert
insert into mysock(id,a) values (1,1)
4、更新语句带where条件
第1个plsql
#不要提交commit
update mysock set a=11 where id=1
第2个plsql
#不同行,正常更新
update mysock set a=2 where id=2
#不同行,正常更新
delete from mysock where id=2
#同行,锁行,一直阻塞等待,直到上面提交commit或回滚
update mysock set a=1 where id=1
#同行,锁行,一直阻塞等待,直到上面提交commit或回滚
delete from mysock where id=1
#正常插入,不影响insert
insert into mysock(id,a) values (1,1)
5、删除语句不带where条件
第1个plsql
#不要提交commit
delete from mysock
第2个plsql
#锁表,一直阻塞等待,直到上面提交commit或回滚
update mysock set a=1 where id=1
delete from mysock where id=2
#正常插入,不影响insert
insert into mysock(id,a) values (1,1)
6、删除语句带where条件
第1个plsql
#不要提交commit
delete from mysock where id=1
第2个plsql
#不同行,正常更新
update mysock set a=2 where id=2
#不同行,正常更新
delete from mysock where id=2
#同行,锁行,一直阻塞等待,直到上面提交commit或回滚
update mysock set a=1 where id=1
#同行,锁行,一直阻塞等待,直到上面提交commit或回滚
delete from mysock where id=1
#正常插入,不影响insert
insert into mysock(id,a) values (1,1)
不管行锁还是表锁,都可以查询出来
#行锁或者表锁查询
SELECT object_name, machine, s.sid, s.serial#
FROM gv$locked_object l, dba_objects o, gv$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid;
#解锁
--alter system kill session 'sid, serial#';
ALTER system kill session '1906, 473';
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)