NB-IoT市场规模将超过319亿美元
二、锁 事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制来解决并发问题。 这里我们主要看数据库中的基本锁。 1、锁的类型
DB2、MySQL、Oracle都支持S-LOCK和X-LOCK,DB2还支持U-LOCK。 2、事务隔离级别中读数据时的锁类型 如上,数据库在各种隔离级别下,SQL执行INSERT/UPDATE/DELETE语句时都会上X-LOCK,那么在读数据时如何上锁呢? DB2和MySQL在Uncommitted Read隔离级别下,不加任何锁。 1)DB2 DB2在另外三种CS、RR、RS隔离级别时,SELECT语句,或CURSOR SELECT无UPDATE OF子句,FETCH时对读出的记录会上S-LOCK,不同的是,CS在读取下一行数据时就释放上一行的锁,RR、RS在事务提交时才释放锁;SELET…FOR UPDATE对读取的数据都是加U锁,CS在读取下一行数据时就释放上一行的锁,RR、RS在事务提交时才释放锁;INSERT/UPDATE/DELETE语句执行时会上X-LOCK,CS、RR、RS都是在事务提交时才释放X锁,其他事务不能对已锁定的行加任何锁。 2)MySQL MySQL的InnoDB在隔离级别READ COMMITED 和 REPEATABLE READ(MySQL的默认隔离级别)下SELECT时不上锁,即MySQL中的一致性非锁定读;只有指定SELECT…LOCK IN SHARE MOAD才对记录上S-LOCK,SERIALIZABLE隔离级别下SELECT对记录上S-LOCK;三种隔离级别下,SELET…FOR UPDATE对读取的数据都是加X锁,在MySQL中叫做一致性锁定读。 3)Oracle Oracle中只支持READ COMMITED和SERIALIZABLE隔离级别。这两种隔离级别下的锁机制和InnoDB一致。Oracle中不需要READ UNCOMMITTED隔离级别,是因为READ UNCOMMITTED主要功能是提高只读时的并发性,而Oracle在READ COMMITED隔离级别下使用一致性非锁定读也有同样的功能。 3、一致性非锁定读 隔离级别READ COMMITED 和 REPEATABLE READ(MySQL的默认隔离级别)都使用一致性非锁定读, SELECT时不上锁,那么如何保证事务的隔离性呢?这两种隔离级别采用快照数据的方式保证隔离性。读取时对于上了X锁的数据,都会去读取行的一个快照数据。快照数据是指该行的之前版本的数据,通过undo段实现。而undo段用来在事务中回滚数据,因此快照数据本身没有额外的开销。 READ COMMITED 和 REPEATABLE READ两种隔离级别在读快照数据时的区别是,RC总是读取最新的快照数据,所以可能会发生不可重复读,即第二次读取的数据和第一次不一致;而RR总是读取事务开始时的快照,所以不会发生不可重复度。 非锁定读机制不会等待行上X锁的释放,极大的提高了数据库的并发性。是InnoDB的默认读取方式。 三、小结
并发控制在保证数据一致性的前提下提供最大的并发性,而保证数据一致性的前提就是保证事务的隔离性,事务的隔离性和并发性是成反比的,隔离级别越高,并发性越低。所以程序要视并发性和隔离性的轻重选择隔离级别。 (编辑:江门站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |