Oracle学习笔记(一)——并发与锁

1 并发

多用户数据库管理系统的一个主要任务是对 并发(concurrency)进行控制,即对多个用户同时访问同一数据进行控制。当缺乏有效的并发控制时,修改数据的操作就不能保证正常,从而危害数据完整性。管理数据并发的方法是让每个用户轮流操作数据。而数据库管理系统的目标就是减少每个用户的等待时间,即让用户无需等待或使等待难以察觉。

为保证数据库性能,Oracle 应用了不同类型的锁和多版本数据完整性模型(multiversion consistency model)。这些特性都包含在事务(transaction)的概念里。应用程序开发人员应该在设计事务时充分发挥其中的并发、完整性等特性。

1.1 读一致性

Oracle 提供的读完整性包含以下特性:

  • 保证在一个时间点上,用户通过查询语句得到的数据是一致的,且语句执行期间数据不会改变(语句级的读完整性)
  • 保证数据库中读数据的用户无需等待正在读或写相同数据的用户
  • 保证数据库中写数据的用户无需等待正在读相同数据的用户
  • 保证在并发事务中写数据的用户只需等待正在写相同数据行的用户

事务是 Oracle 实现读完整性的关键。事务是一组 SQL 语句(这组语句或者被一起提交,或者都不被提交),事务的作用是:

  • 决定了为查询用户生成的保持读完整性的视图的起始点
  • 控制着被一个事务修改过的数据何时可以被数据库中其它进行读写操作的事务看到

*只读事务

默认情况下,Oracle 只保证语句级的读完整性。由一个查询返回的数据对同一时间点来说是一致的。但是在有些情况下,用户可能需要事务级的读完整性。也就是要使一个事务中的多个查询对同一时间点来说都是一致的,这样事务中的每个查询都不会受到与之冲突的事务的干扰。如果用户需要对多个表做多个查询,建议使用只读事务。同理,方法(函数)级的事务控制策略至少应该支持只读事务。

2 各种锁机制

Oracle 也使用 锁(lock)来控制对数据的并发访问。当更新数据时,数据库服务器锁定被修改的数据直到此更新被提交。在这期间,任何用户都不能修改被锁定的数据。这保证了系统的数据完整性。

Oracle 锁定数据的操作无需用户干预,能够自动执行。当一个 SQL 执行时,Oracle 根据实际情况的需要,隐式地对数据加锁。Oracle 的锁管理器自动地在行级对表数据加锁,因此对相同的数据竞争可以最小化。

2.1 共享锁(S锁)

若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。

2.2 排他锁(X锁)

若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。

2.3 有关共享锁和排他锁的解释

锁机制的基本操作是事务T在操作数据对象A时,其他事务不能继续对A操作,直到T完成。若允许其他事务对数据A可读属于共享锁,不可读属于排他锁。

 

扩展阅读:

1.事务隔离级别

2.Spring事务传播机制

posted @ 2018-02-19 13:24  冷豪  阅读(910)  评论(0编辑  收藏  举报