SQL Server 事务

事务全部是关于原子性的。原子性的概念是指可以把一些事情当做一个单元来看待。从数据库的角度看,它是指应全部执行或全部不执行的一条或多条语句的最小组合。

事务4个属性

原子性(Atomicity):事务必须是原子工作单元。对于其数据修改,要么全部执行,要么全不执行。

一致性(Consistency):事务在完成时,必须使所有的数据都保持一致状态。

隔离性(Isolation):有并发事务所做的修改必须与任何其他并发事务所做的修改隔离。

持久性(Durability):事务完成之后,它对与系统的影响是永久的。

事务需要能够定义非常非常明确的边界。事务要有非常明确的开始和结束点。SQL Server中的每一条SELECT、INSERT、UPDATE和DELETE语句都是隐式事务的一部分。即使只发出一条语句,也会包这条语句当做一个事务-要么执行语句中的所有内容,要么什么都不执行。但是如果需要的不只是一条可能是多条语句。在这种情况下,就需要有一种方法来标记事务的开始和结束,以及事务的成功或失败。可以使用一些T-SQL语句在事务中“标记”这些点。

Begin Tran:设置起始点

Commit Tran:使事务成为数据库中永久的,不可逆的一部分

RollBack Tran:将数据恢复到修改前的内容

Save Tran:创建一个特定标记符,只允许部分回滚

步骤

事务隔离级别通过影响读操作来间接第影响写操作;可以在回话级别上设置事务隔离级别也可以在查询(表级别)级别上设置事务隔离级别

事务隔离级别总共有6个隔离级别

Read Uncommitted(未提交哦读,读取脏数据)相当于(Nolock)

Read Committed(已提交读,默认级别)

Repeatable Read(可以重复读),相当于(HoldLock)

Serializable(可序列化)

Snapshot(快照)

Read Committed Snapshot(已经提交读隔离)

ReadCommitted

假设A事务对正在读取数据Data放置了共享锁,那么Data不能被其它事务改写,所以当B事务对Data进行读取时总和A读取的Data数据是一致的,所以避免了脏读。由于在A没有提交之前可以对Data进行改写,那么B读取到的某个值可能会在其读取后被A更改从而导致了该值不能被重复取得;或者当B再次用相同的where字句时得到了和前一次不一样数据的结果集,也就是幻像数据。

ReadUncommitted

假设A事务即不发布共享锁,也不接受独占锁,那么并发的B或者其它事务可以改写A事务读取的数据,那么并发的C事务读取到的数据的状态和A的或者B的数据都可能不一致,那么。脏读、不可重复读、幻象数据都可能存在。

RepeatableRead

假设A事务对读取的所有数据Data放置了锁,以阻止其它事务对Data的更改,在A没有提交之前,新的并发事务读取到的数据如果存在于Data中,那么该数据的状态和A事务中的数据是一致的,从而避免了不可重复的读取。但在A事务没有结束之前,B事务可以插入新记录到Data所在的表中,那么其它事务再次用相同的where字句查询时,得到的结果数可能上一次的不一致,也就是幻像数据。

Serializable

在数据表上放置了排他锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行,这是最严格的锁。它防止了脏读、不可重复读取和幻象数据。

下面为追加的内容

1、 共享锁

用于只读操作(SELECT),锁定共享的资源。共享锁不会阻止其他用户读,但是阻止其他的用户写和修改

2、 更新锁

更新锁是一种意图锁,当一个事务已经请求共享琐后并试图请求一个独占锁的时候发生更新琐。例如当两个事务在几行数据行上都使用了共享锁,并同时试图获取独占锁以执行更新操作时,就发生了死锁:都在等待对方释放共享锁而实现独占锁。更新锁的目的是只让一个事务获得更新锁,防止这种情况的发生。

3、 独占锁

一次只能有一个独占锁用在一个资源上,并且阻止其他所有的锁包括共享锁。写是独占锁,可以有效的防止’脏读’。

4、 意图缩

在使用共享锁和独占锁之前,使用意图锁。从表的层次上查看意图锁,以判断事务能否获得共享锁和独占锁,提高了系统的性能,不需从页或者行上检查。

posted @ 2019-11-02 19:42  xingchen95  阅读(267)  评论(0编辑  收藏  举报