加入收藏 | 设为首页 | 会员中心 | 我要投稿 江门站长网 (https://www.0750zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

NB-IoT市场规模将超过319亿美元

发布时间:2021-02-17 13:19:34 所属栏目:外闻 来源:互联网
导读:二、锁 事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制来解决并发问题。 这里我们主要看数据库中的基本锁。 1、锁的类型 S-LOCK:共享锁。又叫读锁,当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加多个

二、锁

事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制来解决并发问题。

这里我们主要看数据库中的基本锁。

1、锁的类型

  • S-LOCK:共享锁。又叫读锁,当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加多个;
  • X-LOCK:排他锁。又叫写锁。SQL INSERT/UPDATE/DELETE语句执行时会上X-LOCK。排他锁只可以加一个,和其他的排他锁共享锁都相斥;
  • U-LOCK:修改锁。CURSOR SELECT 有UPDATE OF 子句时,FETCH时对读出的记录,会上U-LOCK。

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的默认读取方式。

三、小结

并发控制在保证数据一致性的前提下提供最大的并发性,而保证数据一致性的前提就是保证事务的隔离性,事务的隔离性和并发性是成反比的,隔离级别越高,并发性越低。所以程序要视并发性和隔离性的轻重选择隔离级别。


(编辑:江门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读