Oracle 锁和事务

oracle锁可以分为共享锁和排他锁,或者称为读锁和写锁
oracle锁可以分为行锁和表锁
oracle锁可以分为DML锁和DDL锁
oracle锁可以分为显式锁和隐式锁
oralce锁还包括系统锁

oracle执行DML语句
INSERT, UPDATE, DELETE,SELECT with the FOR UPDATE
会申请当前行的行锁+排他锁
同时还会申请整个表的表锁+共享锁(目的是担心DDL语句的影响)

oracle执行手动加锁操作时也会加上行锁+排他锁,表锁+共享锁
lock table <table_name> in row share mode nowait; 
lock table <table_name> in share update mode nowait; 
lock table <table_name> in row exclusive mode nowait;
lock table <table_name> in share mode nowait;
lock table <table_name> in share row exclusive mode;
lock table <table_name> in exclusive mode nowait;


事务的隔离级别包括
未提交读
读提交
可重复读
串行化

事务的隔离级别可能存在的问题
脏读
不可重复读
幻读

oracle的默认隔离级别是读提交,那么怎么解决不可重复读的问题呢
采用的方法是加一个版本控制字段来做乐观锁
mysql的默认隔离级别是可重复读,怎么怎么解决幻读的问题呢
采用的办法有两种
第一:mvcc 多路版本控制协议
第二:加间隙锁的方式
间隙锁:select * from t_stu where id > 2 for update。
这个时候会锁定范围2到无穷大,加共享锁,不能执行插入。


Oracle事务不会自动提交。通常情况下,oralce将整个存储过程作为一个事务整体,整个过程内的事务,要么都提交,要么都回滚。
如果过程内部使用了commit命令或rollback命令,则存储过程就能够自行控制整个事务的结束时机,而不受整个会话的影响。
如果程序报异常,走到了exception里,则procedure会挂在那里,不会自动提交。
如果存储过程中有锁表(行)操作, 如不显式commit,则procedure会挂在那里,不会自动提交。锁表是同步操作,此时其他调用该procedure的只能等待。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值