数据库的特性以及隔离级别

1.数据库的特性(ACID)
(1)原子性(Atomicity)
原子性意味着数据库中的事务执行是作为原子。即不可再分,整个语句要么执行,要么不执行。
例子:要用事务实现的自定义原子性往往是和业务相关的,比如银行转账,从A账户减去100,在B账户增加100,如果这两个语句不能保证原子性的话,比如从A账户减去100后,服务器断电,而在B账户中却没有增加100.虽然这种情况会让银行很开心,但作为开发人员的你可不希望这种结果.而默认事务中,即使出错了也不会整个事务进行回滚。而是失败的语句抛出异常,而正确的语句成功执行。这样会破坏原子性
(2)一致性(Consistency)
一致性,即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
一致性分为两个层面:
1>数据库机制层面
在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,Check约束等)和触发器设置.
2>业务层面
.这个业务一致性需要由开发人员进行保证.很多业务方面的一致性可以通过转移到数据库机制层面进行保证.比如,产品只有两个型号,则可以转移到使用CHECK约束使某一列必须只能存这两个型号.
比如你定义一个事务,里面的操作是A,B,C三步,系统原子性能保证的是这三步要么都执行,要么都不执行,不可拆分。
(3)隔离性(Isolation)
隔离性:指的是在并发环境中,发事务之间互相影响的程度(即并发事务间数据的可见程度),当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
在Windows中,如果多个进程对同一个文件进行修改是不允许的,Windows通过这种方式来保证不同进程的隔离性:这里写图片描述
而sql Server对数据库文件进行管理,从而可以让多个进程可以同时访问数据库;
一般情况下 .完全的隔离性是不可能的,完全的隔离性要求数据库同一时间只执行一条事务(即事务的执行时序列化的),这样的性能可想而知.想要理解SQL Server中对于隔离性的保障,首先要了解事务之间是如何干扰的.但是同一个事务内的数据库操作的数据是透明的,即同一个事务内的一个数据库操作可以读取另一个未提交(commit)的数据库操作。
事务之间的互相影响的情况分为几种
脏读(Dirty Read),不可重复读(Non-Repeatable Reads),幻读(Phantom Reads)
具体在下面的隔离级别叙述。。。
4)持久性(Durability)
持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中.
SQL SERVER通过write-ahead transaction log来保证持久性。write-ahead transaction log的意思是,事务中对数据库的改变在写入到数据库之前,首先写入到事务日志中。而事务日志是按照顺序排号的(LSN)。当数据库崩溃或者服务器断点时,重启动SQL SERVER,SQL SERVER首先会检查日志顺序号,将本应对数据库做更改而未做的部分持久化到数据库,从而保证了持久性.
总结:
事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的。数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。
下面说事务之间的影响:
脏读: 脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的:
例子: 两个事务,事务A插入一条数据,但未提交,事务B在此期间进行了读取,读取到了事务A未提交的数据,造成脏读
不可重复读(Unrepeatable Read): 不可重复读意味着,在数据库访问中,一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。也就是说,这个事务在两次读取之间该数据被其它事务所修改。
事务A进行第一次查询,事务B对事务A所查询的数据进行了修改,事务A再次执行同一查询,结果由于事务B的影响改变
幻读(phantom read):事务A进行更新,事务B在此期间插入一条符合事务A更新的数据但事务A更新完后进行查询,发现居然没有更新的数据
事务间相互影响解决方案–设置隔离级别
高的隔离级别等级意味着更多的锁,从而牺牲性能.所以这个选项开放给了用户根据具体的需求进行设置。不过默认的隔离等级Read Commited符合了99%的实际需求.事务隔离级别的出现,是为了使你在性能与数据的有效性之间做一个平衡,不是说级别越高越好,只有合适才是最好的
隔离事务之间的影响是通过锁来实现的,通过阻塞来阻止上述效果
数据库的隔离级别(右高到低)分别为:
1)Serializable (串行化):可避免脏读 不可重复读、幻读的发生。2)Repeatable read (可重复读):可避免脏读、不可重复读的发生。
3)Read committed (读已提交):可避免脏读的发生。
4)Read uncommitted (读未提交):最低级别,任何情况都无法保证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值