数据库基础

来源:互联网 发布:淘宝网安徽食品药品 编辑:程序博客网 时间:2024/06/09 18:58

一、事务四大特性(ACID)

原子性:表示组成一个事务的多个数据库操作是一个不可分隔的原子单元,只有所有的操作执行成功,整个事务才提交,事务中任何一个数据库操

作失败,已经执行的任何操作都必须撤销,让数据库返回到初始状态。

一致性:事务操作成功后,数据库所处的状态和它的业务规则是一致的,即数据不会被破坏。如从A账户转账100元到B账户,不管操作成功与否,

A和B的存款总额是不变的。

 隔离性:在并发数据操作时,不同的事务拥有各自数据空间,它们的操作不会对对方产生干扰。 

 持久性:一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中。

二、封锁机制

数据库为了维护这些性质,尤其是一致性和隔离性,一般采用锁机制这种处理方式,同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果

加锁过度,会极大的降低并发处理能力。

基本锁分类:行级锁,表级锁(按照锁的粒度划分)。

行级锁:行级锁是粒度最小的一种锁,代表只对当前操作行加锁。能大大减少数据库操作的冲突,并发性最高,但加锁的系统开销较大,会出现死锁。

表级锁:表级锁是粒度最大的一种锁,代表对当前操作的整张表加锁。造成数据库操作的冲突几率最大,并发性最低,但实现简单,系统开销小,不会出现死锁。

页级锁(mysql):介于以上两种粒度之间的一种锁。

锁按照使用方式可以分为乐观锁和悲观锁。

乐观锁:类似于一种冲突检测机制。乐观锁大多是通过版本号实现的,即在数据库表中增加一列version字段来实现的,在读取数据时,把版本号一同读取出来,在执行完

操作后使版本号加一,提交事务时与数据库中的版本号比较,若大于数据库版本号则执行更新,否则则认为是过期数据。

悲观锁:类似于一种冲突避免机制。悲观锁大多数是依赖于数据库的锁机制来实现的,悲观锁又分为,共享锁(S锁),排他锁(X锁)。

共享锁:由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写。

 排他锁:由写表操作加上的锁,加锁后其他用户不能获取该表或行的任何锁。加排他锁的目的就是为了防止共享锁。

三、事务的隔离级别

那隔离级别和锁是什么关系?通俗来说,隔离级别是锁的一个整体打包解决方案,我的理解是隔离封装了锁。

一般来说,实际开发中,直接操作数据库中各种锁的几率相对比较少,更多的是利用数据库提供的四个隔离级别,未提交读、已提交读、可重复读、串行化。

1.read uncommit。

允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现 。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。

2.read commit。

允许不可重复读取但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行 。SQL Server 默认的级别。在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。

3.read repeatable。

禁止不可重复读取和脏读取。但是有时可能出现幻影数据,这可以通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务 。在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。

4.serializable。

提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到 。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。

针对这四种隔离,他们有各自的优点和缺点,如下表:

原创粉丝点击