本章总结目的: 为了巩固 约束、事务!
约 束
使用数据库约束就是保证数据库的完整性的方法,SQL Server 涉及的完整性有三个:
1、实体完整性 : (不能为空且重复,即唯一的,例如身份证号码)
2、区域完整性 : (指在某个范围内,可以通过数据类型和check约束来设置,例如年龄范围 1~120岁之间)
3、参照完整性 : (避免产生脏数据,例如选课系统之间的相互关联)
1.0 约束的类型
0.1、主键约束 (一表一个)
0.2、外键约束 (表表之间的关联)
0.3、唯一约束 (不能重复的约束,与主键约束的区别是此约束不是唯一的)
0.4、检查约束 (check 限制取值范围)
0.5、非空约束 (Not null 不允许为空)
这些操作暂时用SSMS工具实现,日后如果发现使用T—SQL 语句来操作会提高工作效率,再来总结(因为我只是一个在入门级别上奋斗的C#程序员)
事 务
事务的作用:防止出现错误数据。
在事务中的语句被作为一个整体,要么一起提交,作用在数据库上,永久的修改;要么撤消,回滚,对数据库不做任何修改!
SQL Server 中事务的基本控制语句有如下几个(记):
begin transaction : 表示本地事务的开始
begin distributed transaction : 表示指定一个 由Microsoft分布式事务处理协调器管理的T-SQL分布式事务的起始
commit transaction : 表示事务的提交
rollback transaction :事务的回滚,可以回滚到事务指定的位置(起始点、某个保存点)
commit [work] :事务提交,功能和上一个相同
rollback [work] :事务回滚到事务的起始点,与上一个回滚相同
save transaction :表示设置保存点
事务的特性:原子性(atomic)、一致性(consistent)、隔离性(isolated)、持久性(durable)
事务的模式类型:
SQL Serer中事务的三种模式
1、显示事务
通过 begin transaction 语句来显示启动事务,并由commit transaction 语句来进行事务提交
1 -- 显示事务语法结构 2 begin {tran | transaction} 3 [ { transaction_name | @ tran_name_variable} 4 [ with mark ['description']] 5 ] 6 [ ; ] 7 -- 语法说明 8 begin : 开始事务关键词 9 tran | transaction : 和 begin 一同表示事务开始 10 transaction_name : 事务名称 11 @tran_name_variable : 变量名称,将接受一个事务名称。 12 该变量只能用 char、varchar、nchar或者nvarchar数据类型声明, 13 并且容纳长度<=32,过长则被该变量截取前32位 14 with mark ['description'] : 在日记中标记事务,description 是描述该标记的字符串
示例,介绍前面设计的表 studentinfo,利用显示事务控制DML操作
1 use SQLtest 2 go 3 begin transaction tr_studentinfo -- tr_ 后面跟的是数据表 4 insert into [SQLtest].[dbo].[studentinfo] 5 ([stuno] 6 ,[stuname] 7 ,[stusex] 8 ,[stumajor] 9 ,[stutel] 10 ) 11 values 12 (14 13 ,'110' 14 ,'10' 15 ,'32' 16 ,'345') 17 go 18 update[SQLtest].[dbo].[studentinfo] 19 set[stusex]='12' 20 where[stumajor]='11' 21 go 22 commit transaction tr_studentinfo
注意:如果事务没有提交,在SQL Server 2008 里 虽然提示有受影响的行数,不过你选择编辑200行是看不到数据的!
2、自动提交事务
是默认完成的,我们指需要了解就够了
3、隐式事务
隐式事务需要利用T-SQL语句打开才能使用,打开隐式事务的语句是:
set implicit_transactions on
一旦隐式事务被打开,数据库实例第一次执行 alter table 、insert 、create 、open 、 delete 、 revoke 、
drop 、 select 、 update . . .
需要利用 commit 、 rollback 结束。
示例:
1 -- 隐式事务 2 use SQLtest 3 go 4 set implicit_transactions on -- 打开隐式事务的语句 5 --与显示事务的区别是这里的transaction需要加个 S 6 insert into [SQLtest].[dbo].[studentinfo] 7 ( 8 [stuno] 9 ,[stuname] 10 ,[stusex] 11 ,[stumajor] 12 ,[stutel] 13 ) 14 values 15 ( 16 12 17 ,'132' 18 ,'4' 19 ,'345' 20 ,'2324' 21 ) 22 go 23 24 update [SQLtest].[dbo].[studentinfo] 25 set [stuname]='190' 26 27 go 28 29 commit 30 set implicit_transactions off
事务的保存点 :
当事务执行失败,为了不从头开始,SQL 设置了事务的保存点。
设置事务到保存点和事务回滚至保存点的语法如下:
sava transaction savapoint_name(保存点的名称)
rollback transaction savapoint_name
事务的并发控制
前面学习的是单一用户使用数据库情况,可是数据库是一个多用户系统,同一时间多用户访问。为了保证数据的准确性,将对事务并发控制。
并发访问遇到的问题
1、数据的丢失
2、脏读
3、非重复读
4、幻想读
-- 这里只是提一下,我想作为一个程序员,而不是数据库管理员,不用这么大动干戈吧 ?
锁、活跃事务的查看、事务阻塞、死锁 . . . 同样不是程序员的事吧 ?