技术开发 频道

浅谈SQL Sever数据库中事务的ACID特性

  理解SQL SERVER中的隔离级别

  为了避免上述几种事务之间的影响,SQL Server通过设置不同的隔离等级来进行不同程度的避免。因为高的隔离等级意味着更多的锁,从而牺牲性能.所以这个选项开放给了用户根据具体的需求进行设置。不过默认的隔离等级Read Commited符合了99%的实际需求.

  SQL Server隔离事务之间的影响是通过锁来实现的,这个概念比较繁杂,所以本文不会详细对这个概念进行讲解.通过阻塞来阻止上述效果。

  SQL Server提供了5种选项来避免不同级别的事务之间的影响。

  隔离等级由低到高分别为:

  Read Uncommited(最高的性能,但可能出现脏读,不可重复读,幻读)

  Read commited(可能出现不可重复读,幻读)

  Repeatable Read(可能出现幻读)

  Serializable(最低的性能,一次只能执行一个事务,但避免了上述所有情况)

  SNOPSHOT(这个是通过在tempDB中创建一个额外的副本来避免脏读,不可重复读,会给tempDB造成额外负担,因为不是标准ANSI SQL标准,不详细讨论)

  总之,不同的隔离级别是通过加不同的锁,造成阻塞来实现的,来看一个例子:

  SQL SERVER通过阻塞来阻止脏读,所以保持独立性会以付出性能作为代价:

浅谈SQL Sever数据库中事务的ACID特性

  理解持久性(Durability)

  持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

  即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中.

  SQL SERVER通过write-ahead transaction log来保证持久性。write-ahead transaction log的意思是,事务中对数据库的改变在写入到数据库之前,首先写入到事务日志中。而事务日志是按照顺序排号的(LSN)。当数据库崩溃或者服务器断点时,重启动SQL SERVER,SQL SERVER首先会检查日志顺序号,将本应对数据库做更改而未做的部分持久化到数据库,从而保证了持久性.

  总结

  本文简单讲述了ACID的概念和ACID在SQL SERVER中的实现.ACID只是一个理念,并不是某项具体的技术.对于健壮数据库来说,保证ACID是可靠数据库的前提.

0
相关文章