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
在数据表上放置了排他锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行,这是最严格的锁。它防止了脏读、不可重复读取和幻象数据。
下面为追加的内容