“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情”
I 锁
什么是锁? 锁(lock)机制用于管理对共享资源的并发访问。
1.1 锁定数据行
for update 和for update nowait 是对操作的数据行进行加锁,在事务提交前防止其他操作对数据的修改。
锁定了emp表中id=1的那行数据
select * from emp where emp.id=1 for update nowait
--通过for update锁定后,这些行不能修改了,但是还可以查询。
--for update wait n (n是时间,单位:秒),即会等待n秒。
- 使用for update锁定行,对这行执行
update,delete,select, for update语句都会阻塞,即等待锁的释放后继续执行。 - 使用
for update nowait锁定行,对这行执行update,delete,select, for update语句,会马上返回一个“ORA-00054:resource busy”错误,不用一直等待锁的释放后继续执行.
1.2 锁类型
- DML锁:用于确保一次只能修改某一行,而且别人不能删除你正在处理的表, DML锁包括
事务锁(TX锁),事务发起第一个修改时会得到TX锁,而且会一直持有这个锁,直至事务commit或者rollback。- DML Enqueue (TM)锁:用于确保在修改表的数据时,表的结构不会改变,当更新了一个表的数据时,你就会得到这张表的一个TM锁
-
DDL锁:DDL操作过程中会自动为对象加DDL锁,保护这些对象不会被其它会话修改。
-
latch:轻量级的串行化设备,用于协调对共享数据结构、对象和文件的多用户访问。 这是Oracle的内部锁,用于协调对其共享数据结构的访问,Latch用于保护某些内存结构,如数据库快缓冲区或共享池中的库缓存。
-
乐观锁: 给表加一个version字段,保存数据行的版本。查询时,得到version的值,假设为100。通过类型下面语句保存
update emp set value=500
where id=1 and version=100
-- 如果更新条数等于1,说明保存成功,更新version值加1。
--如果更新条数等于0,说明保存失败,说明有其它用户修改了这条记录。
- 悲观锁: 数据库级别的解决办法,从而有效的保证的数据的正确性;通过各种途径操作数据库(java项目,pl/sql developer…),都会得到很好的保护。
悲观锁性能差,不能并发操作,只能排队等待处理。实际上,查询的操作完全可以并发处理的。
可移植性差,依赖于特定数据库,而且并不是所有数据库提供悲观锁。
II 事务
事务是包含一系列步骤的完整操作。kunnan.blog.csdn.net/article/det…
2.1 事务ACID特性
- 原子性(atomicity):事务的所有步骤,要么都成功,要么都失败。
- 一致性(consistency):事务将数据从一种一致状态转变为下一种一致状态。
- 隔离性(isolation):一个事务的执行不能被其他事务干挠,在该事务提交之前对其它事务都不可见。
- 持久性(durability):事务一旦提交,其结果就是永久性的。
2.2 事务控制语句
commit:提交事务,将事务期间所做修改保存。
rollback:回滚事务,撤销事务期间所做的修改。
savepoint:在事务中创建“标记点”,可以回滚到这些标记点。
rollback to :回滚到标记点,而不回滚标记点之前的修改,rollback to savepoint不会结束事务。
set transaction:设置事务属性,如事务的隔离级别以及事务是只读还是可读写的。