本章总结目的:    为了巩固 约束、事务!

约 束

使用数据库约束就是保证数据库的完整性的方法,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 语句来进行事务提交

 --   显示事务语法结构
begin {tran | transaction}
[ { transaction_name | @ tran_name_variable}
[ with mark ['description']]
]
[ ; ]
-- 语法说明
begin : 开始事务关键词
tran | transaction : 和 begin 一同表示事务开始
transaction_name : 事务名称
@tran_name_variable : 变量名称,将接受一个事务名称。
该变量只能用 char、varchar、nchar或者nvarchar数据类型声明,
并且容纳长度<=32,过长则被该变量截取前32位
with mark ['description'] : 在日记中标记事务,description 是描述该标记的字符串

示例,介绍前面设计的表 studentinfo,利用显示事务控制DML操作

 use SQLtest
go
begin transaction tr_studentinfo -- tr_ 后面跟的是数据表
insert into [SQLtest].[dbo].[studentinfo]
([stuno]
,[stuname]
,[stusex]
,[stumajor]
,[stutel]
)
values
(14
,''
,''
,''
,'')
go
update[SQLtest].[dbo].[studentinfo]
set[stusex]=''
where[stumajor]=''
go
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 结束。

示例:

 --  隐式事务
use SQLtest
go
set implicit_transactions on -- 打开隐式事务的语句
--与显示事务的区别是这里的transaction需要加个 S
insert into [SQLtest].[dbo].[studentinfo]
(
[stuno]
,[stuname]
,[stusex]
,[stumajor]
,[stutel]
)
values
(
12
,''
,''
,''
,''
)
go update [SQLtest].[dbo].[studentinfo]
set [stuname]='' go commit
set implicit_transactions off

事务的保存点 :

当事务执行失败,为了不从头开始,SQL 设置了事务的保存点。

设置事务到保存点和事务回滚至保存点的语法如下:

sava transaction savapoint_name(保存点的名称)

rollback transaction savapoint_name

事务的并发控制

前面学习的是单一用户使用数据库情况,可是数据库是一个多用户系统,同一时间多用户访问。为了保证数据的准确性,将对事务并发控制。

并发访问遇到的问题

1、数据的丢失

2、脏读

3、非重复读

4、幻想读

-- 这里只是提一下,我想作为一个程序员,而不是数据库管理员,不用这么大动干戈吧 ?

锁、活跃事务的查看、事务阻塞、死锁 . . .  同样不是程序员的事吧 ?

SQL Server 基础 02 确保数据完整性的更多相关文章

  1. 数据库开发基础-SQl Server 基础

    SQL Server 基础 1.什么是SQL Server SQL:Structured Query Language  结构化查询语言 SQL Server是一个以客户/服务器(c/s)模式访问.使 ...

  2. Sql Server 基础知识

    Sql Server 基础知识: http://blog.csdn.net/t6786780/article/details/4525652 Sql Server 语句大全: http://www.c ...

  3. SQL server基础知识(表操作、数据约束、多表链接查询)

    SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...

  4. 【SQL Server】SQL Server基础之存储过程

    SQL Server基础之存储过程  阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储 ...

  5. Sql Server 基础语法

    来自:http://www.cnblogs.com/AaronYang/archive/2012/04/24/2468093.html Sql Server 基础语法 -- 查看数据表 select  ...

  6. 《SQL Server基础——SQL语句》

    SQL Server基础--SQL语句       一.创建和删除数据库: 1.创建数据库(默认化初始值) 格式: CREATE DATABASE 数据库名称 例如: CREATE DATABASE ...

  7. SQL Server基础之索引

     索引用于快速找出在某个列中有某一特定值的行,不使用索引,数据库必须从第一条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,数据库能快速到达一个位置 ...

  8. sql server 基础教程[温故而知新三]

    子曰:“温故而知新,可以为师矣.”孔子说:“温习旧知识从而得知新的理解与体会,凭借这一点就可以成为老师了.“ 尤其是咱们搞程序的人,不管是不是全栈工程师,都是集十八般武艺于一身.不过有时候有些知识如果 ...

  9. 【SQL server】SQL server基础(二)

    一.一些重要的SQL命令 SELECT - 从数据库中提取数据 UPDATE - 更新数据库中的数据 DELETE - 从数据库中删除数据 INSERT INTO - 向数据库中插入新数据 CREAT ...

随机推荐

  1. ASP.NET页面传值的几种方式

    页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值. 存储对象传值.ajax.类.model.表单等!下面欧柏泰克和大家一起来看看asp.net页面传值方式一般有哪些?常用的较简单 ...

  2. javaweb学习路之三--websocket多人在线聊天

    在之前的项目基础上,加入了一个聊天室的功能,为了界面好看 引入了AmazeUI和umeditor最终效果图如下: 源码在 https://github.com/Zering/MyWeb 目前练习都在这 ...

  3. nopcommerce插件使用

    nopcommerce是国外用.net开发的电商b2c开源项目,主要涉及技术包括了ef+mvc. 今天主要分析nop的插件机制. 什么是插件?插件是预先开发好的可以独立运行的功能模块,把单独的功能模块 ...

  4. 自定义cell相关注意事项

    1.拖线成功后,如果又在.h文件或者.m文件里面删除了对应的属性或者方法.一定要在xib文件中,删除关联.方法是:右键点击一下对应的UI控件,把多余的关联叉掉就行了.  不然容易崩溃.

  5. JAVA知识的相关积累--用于自己以后查找

    基础: Properties类操作文件,主要是对配置文件的操作.java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容 ...

  6. 打包jar类库与使用jar类库

    翻译人员: 铁锚 翻译时间: 2013年11月17日 原文链接:  Build a Java library by using jar file 代码复用是软件开发中很重要的一个原则.将常用的函数构建 ...

  7. linux命令行后台运行与调回

     直接ctrl+z  这个是暂时到后台执行   要调回来  输入  fg 

  8. python2.7_1.4_将IPV4地址转换成不同的格式

    代码如下: # -*- coding: utf-8 -*- import socket from binascii import hexlify def convert_ip4_address(): ...

  9. Qt之QNetworkInterface(查询网络接口),QHostInfo(查询主机IP)

    http://blog.csdn.net/u011012932/article/details/50775052 http://blog.csdn.net/u011012932/article/det ...

  10. 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)

    原文 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还 ...