• SQL Server 基础 02 确保数据完整性


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

     

                                                                      约 束

    使用数据库约束就是保证数据库的完整性的方法,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 该变量只能用 charvarchar、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、幻想读

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

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

                                     

  • 相关阅读:
    SourceTree 3.0.17如何跳过注册进行安装? — git图形化工具(一)
    一键复制功能
    如何适配处理iphoneX底部的横条
    .gitignore文件如何编写?
    Spring事务管理——事务的传播行为
    数据库事务之声明式事务
    JVM中的内存分区简介
    SpringMVC中文件的上传(上传到服务器)和下载问题(二)--------下载
    SpringMVC中文件的上传(上传到服务器)和下载问题(一)--------上传
    HashMap和Hashtable的区别
  • 原文地址:https://www.cnblogs.com/izhiniao/p/3697128.html
Copyright © 2020-2023  润新知