数据库的锁与隔离级别

多用户同时对数据库进行存取操作时,就需要对数据库的一些对象进行锁定,不然就可能产生数据不一致的后果,这个道理和多线程对同一资源进行操作时,必须对资源进行锁操作是一个道理。

在数据库的锁机制定义中有 乐观锁(或积极锁,optimistic locking)悲观锁(或消极锁,pessimistic locking)两种分类。
乐 观锁,顾名思义,对发生并发的情况估计比较乐观,所以对锁的控制比较宽松,只有当对某项记录进行修改操作的时候,才对其进行锁定。这样如果两个事务 (transaction)先后修改了某项记录,可能会导致数据修改的失败,因为这不是事务一级的锁,事务处理过程中会有某些时段对记录是没有加锁的,另 一事务在这个时段就可能修改同一记录,导致前者修改失败。
悲观锁,与乐观锁相反,与事务结合在一起,对数据库的并发性进行控制(可能完全没有并发性,对每个事务串行处理),对数据库管理系统(DBMS)有额外的负担,但能保证对记录修改的成功。

锁是通过数据库管理系统的 隔离级别(Isolation Level)来 定义的。隔离性(Isolation)是ACID(Atomicity, Consistency, Isolation, Durability)之一。但相对其他三性,隔离性只是在理论上是要求严格的,在实际中一般没有必要保证完全的隔离性(数据库开销太大,实现复杂)。

数据库管理系统提供四种隔离级别。级别越高,隔离性越强,但是并发性越差或者数据库管理系统的实现复杂,比如实现多版本并发控制(multiversion concurrency control)。

隔离级别定义有, 串行(Serializable),可重复读(Repeatable Read),提交可读(Read Committed),未提交可读(Read Uncommitted)

Serializable定义下,是最高的隔离级别,所有的事务都是在完全隔离的情况下进行。
Repeatable Read是次高的隔离级别,这种隔离级别下,可能发生幻读(Phantom Reads)。这种级别下,事务中被SELECT出来的所有记录都被锁定,不可能被修改。但是如果这个SELECT后面带有WHERE过滤语句,那么不在 这个WHERE语句范围之内的记录是可以被修改的。这就是所谓的幻读。
Read Committed级别下,一个事务SELECT出来的记录不能保证不被另一个事务修改,只要另一个事务在修改后进行了提交(Commit)。
Read Uncommited是最松的隔离级别,这种级别下,脏读(Dirty Reads)是可以发生的。也就是说,一个事务可以修改另一个事务SELECT出来的记录,即使它没有提交这个修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值