事务具有ACID属性
即 Atomic原子性, Consistent一致性, Isolated隔离性, Durable永久性
原子性
就是事务应作为一个工作单元,事务处理完成,所有的工作要么都在数据库中保存下来,要么完全
回滚,全部不保留
一致性
事务完成或者撤销后,都应该处于一致的状态
隔离性
多个事务同时进行,它们之间应该互不干扰.应该防止一个事务处理其他事务也要修改的数据时,
不合理的存取和不完整的读取数据
永久性
事务提交以后,所做的工作就被永久的保存下来
二 事务并发处理会产生的问题
丢失更新
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题、
每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。
脏读
当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。
第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。
不可重复读
当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。
不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。
然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。
幻像读
当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。
事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。
三 事务处理类型
自动处理事务
系统默认每个T-SQL命令都是事务处理 由系统自动开始并提交
隐式事务
当有大量的DDL 和DML命令执行时会自动开始,并一直保持到用户明确提交为止,切换隐式事务可以用SET IMPLICIT_TRANSACTIONS
为连接设置隐性事务模式.当设置为 ON 时,SET IMPLICIT_TRANSACTIONS 将连接设置为隐性事务模式。当设置为 OFF 时,则使连接返回到自动提交事务模式
用户定义事务
由用户来控制事务的开始和结束 命令有: begin tran commit tran rollback tran 命令
分布式事务
跨越多个服务器的事务称为分布式事务,sql server 可以由DTc microsoft distributed transaction coordinator
来支持处理分布式事务,可以使用 BEgin distributed transaction 命令启动一个分布式事务处理
四 事务处理的隔离级别
使用SET TRANSACTION ISOLATION LEVEL来控制由连接发出的所有语句的默认事务锁定行为
从低到高依次是
READ UNCOMMITTED
执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。
举例
设table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
新建两个连接
在第一个连接中执行以下语句
select * from table1
begin tran
update table1 set c='c'
select * from table1
waitfor delay '00:00:10' --等待10秒
rollback tran
select * from table1
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
print '脏读'
select * from table1
if @@rowcount>0
begin
waitfor delay '00:00:10'
print '不重复读'
select * from table1
end
第二个连接的结果
脏读
A B C
a1 b1 c
a2 b2 c
a3 b3 c
'不重复读'
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
READ COMMITTED
指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '不重复读'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
update table1 set c='c'
第一个连接的结果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
不重复读
A B C
a1 b1 c
a2 b2 c
a3 b3 c
REPEATABLE READ
锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '幻像读'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
insert table1 select 'a4','b4','c4'
第一个连接的结果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
幻像读
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
a4 b4 c4
SERIALIZABLE
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '没有变化'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
insert table1 select 'a4','b4','c4'
第一个连接的结果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
没有变化
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
五 事务处理嵌套的语法和对@@TRANCOUNT的影响
BEGIN TRAN @@TRANCOUNT+1
COMMIT TRAN @@TRANCOUNT-1
ROLLBACK TRAN
3、范式
关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。满足最低要求的叫做第一范式简称1NF,在第一范式中满足进一步要求的为第二范式,其余依次类推。
1) 第一范式: 定义6:在一个关系模式中,如果R的每一个属性对应的域值都是不可再分的,(即每一个分量必须是不可分的数据项),则称R属于第一范式,即R∈1NF。 不属于第一范式的例子,如图2所示。
CNO PNO PNAME PRICE QTY DATE DNAME ADDR TEL
C1 P1 P2 BOLT NUT 0.30.81500500 93.12 XINHE BEIJING 86421
C2 P1 P3 P5 BOLT CAM GEAR 350175 94.4 SHENLI XIAN 65384
C3 P2 P3 NUT CAM 0.825 300140 94.2 HUANGE TIANTIN 54112
图 2 销售合同
CNO: 合同号 PNO: 产品号 PNAME:产品名
PRICE:单价 QTY: 数量 DATE: 供货日期
DNAME:购买单位 ADDR:地址 TEL: 电话号码
图3符合1NF。
CNO PNO PNAME PRICE QTY DATE DNAME ADDR TEL
C1 P1 BOLT 0.3 1500 93.12 XINHE BEIJING 86421
C1 P2 NUT 0.8 500 93.12 XINHE BEIJING 86421
C2 P1 BOLT 0.3 800 94.4 SHENLI XIAN 65384
C2 P3 CAM 25 350 94.4 SHENLI XIAN 65384
C2 P5 GEAR 31 175 94.4 SHENLI XIAN 65384
C3 P2 NUT 0.8 300 94.2 HUANGE TIANTIN 54112
C3 P3 CAM 25 140 94.2 HUANGE TIANTIN 54112
图 3
2) 第二范式: 定义7:如果一个关系属于第一范式,而且其中的各个非主属性都完全函数依赖于它的每一个候选键,则这个关系属于第二范式。
在图3所表示的销售合同关系中,其关键字为CNO+PNO,是一个联合键。关系中的其余属性:PNAME和PRICE仅与PNO有关,而DATE,DNAME,ADDR和TEL与CNO有关,他们都是局部函数依赖于关键字CNO+PNO的,需要对该关系进行分解。如图4所示。
CP CNO PNO QTY
C1 P1 1500
C1 P2 500
C2 P1 800
C2 P3 350
C2 P5 175
C3 P2 300
C3 P3 140
PPNO PNAME PRICE
P1 BOLT 0.3
P2 NUT 0.8
P3 CAM 25
P5 GEAR 31
CD
CNO DNAME ADDR TEL DATE
C1 XINHE BEIJING 86421 93.12
C2 SHENLI XIAN 65384 94.4
C3 HUANGE TIANJIN 54112 94.2
图 4
3) 第三范式:定义8:如果一个关系模式属于第二范式,且其中的任何非主属性都不传递函数依赖于它的每一个候选键,则这个关系属于第三范式。如图5所示。
在关系CD中,还是存在着存储异常。这是由于在关系CD中还存在着传递函数依赖。在CD中,DNAME函数依赖于合同号CNO,而ADDR和TEL却直接函数依赖于DNAME,因此CNO与ADDR和TEL间存在着传递函数依赖。
CD
CNO DNAME DATE
C1 XINHE 93.12
C2 SHENLI 94.4
C3 HUANGE 94.2
DNAME ADDR TEL
XINHE XIAN 86421
SHENLI TANJIN 65384
HUANGE BEIJING 54112
图 5
各种范式及规范化过程:
1NF到2NF:消除非主属性对码的部分函数依赖
2NF到3NF:消除非主属性对码的传递函数依赖
理解4种范式..(ZT) 主要有4种范式,1NF,2NF,3NF,BCNF(前3个称为第X范式,第4个忘了是什么意思了,BC好像是人名),按从左至右的顺序一种比一种更严格。要符合某一种范式必须也满足她左边的所有范式。一般达到3NF就够了。说白了,1NF就是要求一张表里只放相互关联的字段,不要把风的方向,马的品种和牛的数量3个字段放在一张表里,这只是最基本的要求,其实不说也没人会这样做。至于2NF,3NF,BCNF虽然描述的内容不同,但表现在数据特点上很相似,就好比在说不要为了把你哪天(A)和哪个女孩(B)的约会记下来就把的女孩姓名(B)、胸围(C)都放在同一张表里,既不要用ABC一张表,而用AB,BC两张表,以尽量避免浪费数据存储空间。因为和同一个女孩可能会约会好几次,但没必要每次都记录她的胸围。
1NF:没有重复字段
2NF:没有不完全依赖函数字段
3NF:没有间接依赖函数字段
第一范式:消除组中的重复,也就是说列中是否存储了其他列中的信息
第二范式:消除部分依赖列,也就是说是否有依赖于一部分主键的列
第三范式:消除非依赖列,是否有依赖于非主键的列
例如:
学生信息表
学生ID,姓名,地址,城市,邮政编码,所在年级,性别,参加课程,课程级别,课程ID,名称,描述,教师ID,教
师姓名,时间表,地点,先决课程
如果这么多字段在同一个表里,那么这种设计会被认为没有正规化,这里有很多重复的信息,为了把数据库设计转化
为第一范式,需要把信息分成两个表,并在两个表之间建立关系,如下:
学生表
学生ID,姓名,地址,城市,邮政编码,所在年级,性别
学生课程表
学生ID,课程ID,名称,描述,教师ID,教师姓名,时间表,地点
通过把学生从课程中分离,我们可以消除由不同的逻辑组引入的重复,我们必须满足消除信息重复的目标。接下来,
从第一范式到第二范式,我们需要消除表中仅仅部分依赖主键的列,这些列应该被分割到不同的表中。在学生课程表
中,许多列仅仅依赖于课程ID,而不依赖于学生ID,这个表的主键是学生ID+课程ID,因此把这个表分成两个表,如下
:
学生课程表
学生ID,课程ID,课程级别
课程表
课程ID,名称,描述,教师ID,教师姓名,先决课程,时间表,地点
既然对主键的部分依赖已经消除,数据库就已经满足第二范式了。为了进一步把数据库转化为第三范式,需要把表中
对构成主键的列的不依赖部分分离出去,教师姓名依赖于教师ID,而不依赖于课程ID,索引,这些列应该被分离以形
成一个新表,如下:
教师表
教师ID,教师姓名
最终的课程表如下
课程ID,名称,描述,教师ID,时间表,地点
一旦所有的数据库的设计依赖性都被消除,也就满足了第三范式。
不一定每种数据库设计都要达到第三范式,因为达到第三范式在查询的时候进行大量的连接操作,所以要针对你的情况设计你的数据库。