事务、视图和索引

事务:是单个的工作单元,如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分,如果事务遇到
      错误且必须在取消和回滚,则所有数据更改均被消除。


为什么需要事务:
如:银行有一原则:即有借有贷,借贷相等。如果出现只记录了借方科目,或者只记录了贷方科目的情况,就违反了记帐原则,会出现
   记错帐的情况。通过事务机制以保证事务的一致性。


什么是事务:
事务是一种机制,一个操作序列,它包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求
即这一组数据库命令,要么都执行,要么都不执行。因此事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时
事务是作为最小的控制单元来使用的,它特别适用于多用户同时操作的数据库系统。如:航空公司的订票系统、银行、保险公司及
证券交易等

事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有4个属性:
1.原子性、
2.一致性、
3.隔离性、
4.持久性。


1.原子性:
事务是一个完整的操作,事务的各元素是不可分的(原子性),事务中的所有元素必须作为一个整体提交或回滚,如果事务中的任何
元素失败,则整个事务将失败。
事务不能部分提交。


2.一致性:
当事务完成时,数据必须处于一致状态。


3.隔离性:
对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应该以任何方式依赖于或影响其他事务。



4.持久性:
事务的持久性指不管系统是否发生了故障,事务处理的结果都是永久的。
一个事务成功完成之后,它对于数据库改变是永久性的,即使系统出现故障也是如此。就是说,一旦事务被提交,事务的效果会被永久的保留在数据库中。
如果系统Sql Server 数据库或者某些组件发生了故障,则数据库会在系统重新启动的时候自动恢复。Sql Server使用事务日志保存受到故障影响的事务并重新运行未提交的事务。


如何执行事务:
1.执行事务的语法:
一:开始事务

begin transaction -- 这个语句显式的标记一个事务的起始点

二:提交事务

commit transaction --这个语句标志一个事务成功结束。


自事务开始至提交语句之间执行的所有数据更新将永久地保存在数据库数据文件中,并释放连接时占用的资源。


三:回滚(撤销)事务

rollback transaction


清除自事务起始点至该语句所做的所有数据更新操作,将数据状态回滚到事务开始前,并释放由事务控制的资源


begin transaction 语句后面的Sql语句对数据库数据的更新操作都将记录在事务日志中,直至遇到
rollback transaction 语句或 commit transaction 语句。
如果事务中某一操作失败且执行了 rollback transaction 语句,那么在 begin transaction 语句之后所有更新的数据都能回滚到事务开始前的状态。
如果事务中的所有操作都全部正确完成,并且使用了 commit transaction 语句向数据库提交更新数据,则此时的数据又处在新的一致状态


2.事务分类:
在Sql Server 中,事务有以下3种类型:
1.显式事务:
用 begin transaction 明确指定事务的开始


2.隐式事务:
通过设置 set implicit_trnsactions on 语句,将隐式事务模式设置为打开,
以隐式事务操作时,Sql Server 将在提交或回滚事务后自动启动新事务,不需要描述每个事务的开始,只要提交或回滚每个事务即可。


3.自动提交事务:
这是Sql Server 的默认模式,它将每条单独的T-Sql语句视为一个事务,如果成功执行,则自动提交,如果错误,则自动回滚。

在实际开发中最常用的就是显式事务,它明确地指定事务的开始边界。

3.事务应用示例:

set nocount on  --不显示受影响的行数信息
print '查看转帐事务前的余额'
select * from bank
go


/*-开始事务(指定事务从此处开始,后续的T-Sql语句都是一个整体)-*/
begin transaction 


/*-定义变量,用于累计事务执行过程中的错误-*/
declare @errorSum int 
set @errorSum = 0     --初始化为0 ,即无错误


/*-转帐:张三的帐户少1000元,了四的帐户多1000元-*/
update bank set costomerMoney=costomerMoney-999 where customerName='张三'


set @errorSum=@errorSum+@@ERROR  --累计是否有错误


update bank set costomerMoney=costomerMoney+999 where customerName='李四'


set @errorSum=@errorSum+@@ERROR  --累计是否有错误


print '查看转帐事务过程中的余额'


select * from bank




/*-根据是否有错误,确定事务是提交还是撤销-*/
if(@errorSum>0)
begin
print '交易失败,回滚事务'
rollback transaction
end 
else
begin 
print '交易成功,提交事务,写入硬盘,永久的保存'
commit transaction
end
go




print '查看转帐事务后的余额'


select * from bank
go


编写事务时要遵守以下原则:


1.事务尽可能简短:
事务启动至结束后在数据库管理系统中保留大量资源,以保证事务的原子性、一致性、隔离性、持久性。如果在多用户系统中,较大的事务将会占用系统的大量资源
,使得系统不堪重负,会影响软件的运行性能,甚至导致系统崩溃


2.事务中访问的数据量尽量最少:
当并发执行事务处理时,事务操作的数据量越少,事务之间对操作数据的争夺就越少

3.查询数据时尽量不要使用事务
对数据进行浏览查询操作并不会更新数据库的数据,因此尽量不使用事务查询数据,避免占用过量的系统资源

4.在事物处理过程中尽量不要出现等待用户输入的操作:
在处理事务的过程中,如果需要等待用户输入数据,那么事务会长时间地占用资源,在可能造成系统阻塞

视图

使用视图的原因有两个:
一个是出于安全考虑,用户不必看到整个数据库的结构,隐藏部分数据
另一个是符合用户日常业务逻辑,使全心全意对数据更容易理解


什么是视图:
视图是另一种查看数据库中一个或多一表中数据的方法,
视图是一种虚拟表,通常是作为来自一个或多个表的行或列的子集创建的。
视图充当着查询中指定表筛选器。定义视图的查询可以基于一个或多个表,也可以基于其他视图、当前数据库或其他数据库

视图通常用来进行以下3种操作:
1.筛选表中的行
2.防止未经许可的用户访问敏感数据表
3.将多个物理数据表抽象为一个逻辑数据表。

一、对最终用户的好处:


结果更容易理解
创建视图时,可以将列名改为有意义的名称,使用户更容易理解列所代表的内容,在视图中修改列名不会影响基表的列名

获得数据更容易
很多人对SQL 不太了解,因此对全心全意来说,创建对多个表的复杂查询很困难,可以通过创建视图来方便用户访问多个表中的数据。


二、对开发人员的好处:

限制数据检索更容易
开发人员有时需要隐藏某些行或列中的信息。通过使用视图,用户可以灵活地访问他们需要的数据,同时保证同一个表或其他表中的其他数据的安全性,
要实现这一目标,可以在创建视图时将对用户保密的列排除在外。


维护应用程序更方便
调试视图比调试查询更容易,跟踪视图中各个步骤的错误更为容易,这是因为所有的步骤都是视图的组成部分。


T-Sql 语句创建视图


语法:
create view vw_name
as