虽然学过SQLServer,但是在脑海里总是觉得很乱,并且有很多疑问和盲点,如今走入工作岗位,那么这些关于自己知识和技术的漏洞是不应该存在了,至少学一种语言或是技术,最起码要知道是什么、做什么、有什么用、什么时候用、怎么用。如果连这一点都不是很清楚的话那么我不敢相信你做出来的东西有多好,有多强。以前在学习的时候,总觉得这些理论知识,自己知道就行了,不必太在意,会操作,能使用就行了,可是如今我不这么认为了,可能这些很基础的理论知识学起来很抽象,很枯燥,但是他们真的很有用。作为一名技术人员,没有清晰透彻的理论作为基础,那么在技术这条道路上是走不远,飞不高的。。。最近我在业余时间抽空复习自己所学的东西,找到一些不错的资料,在此分享给正在学习中的朋友们,我相信这些资源对你们的学习是很有用的。好了,废话有点多了,咱们开始吧。声明:一下内容是我转载的一些内容,稍作些许加工,以下有地址来源。。。

SQL教程: 事务

我们知道各种子查询的用法,包括简单子查询、IN子查询和EXISTS子查询。除此之外,我们在实际开发中还会用到一些比较特殊的高级查询,包括事务、索引和视图。

例如,银行转账问题:假定资金从账户A转到账户B,至少需要两步,即账户A的资金减少,然后账户B的资金相应增加。在进行资金转账时,系统必须保证:这些步骤是一个整体,如果其间任一步骤失败,则将撤销对这两个账户数据所做的任何修改,这时就需要使用事务处理。事务是指一个工作单元,该单元可以包含多个步骤来完成所需的任务。一个事务作为一个整体,要么成功,要么失败。

正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4KB。为了加快查找的速度,汉语字(词)典一般都有按拼音、笔画、偏旁部首等排序的目录(索引),我们可以选择按拼音或笔画查找,快速查找到需要的字(词)。同理,SQL Server允许用户在表中创建索引,指定按某列预先排序,从而大大提高查询速度。

同一星球,用望远镜从不同的角度或方位观看,将看到星球的不同位置,从而得到不同的结果。同一张员工信息表数据,因为公司保密的原因,可能要求不同权限的人员看到不同的员工信息。例如:财务人员只能查看员工的姓名、工资、奖金等;技术部经理只能查看员工的姓名,职称、技能等;人事部经理只能查看员工的姓名、工作经历和发展方向等;总经理当然可以全部查看。如何更加安全、直观地显示数据结果呢?SQL Server中允许用户创建视图,在同一原始数据表的基础上,为不同的用户选择不同的列,从而达到不同用户的需求。

下面我们将详细讨论事务、索引和视图的具体使用。

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

一、为什么需要事务

一般来说,只要是同一银行(例如都是农行),一般都支持账户间直接转账。我们来看看上述提及的转账问题,假定张三的账户直接转账1000元到李四的账户,就需要创建账户表,存放用户的账户信息,T-SQL语句如示例1

/*--举例:为什么需要事务--*/
--同一银行,如都是农行的帐号,可以直接转账
/*---------------建表-----------------*/
USE stuDB
GO
 
--创建农行帐户表bank
IF EXISTS(SELECT * FROM sysobjects WHERE name='bank')
   DROP TABLE bank
GO
 
CREATE TABLE bank
(
    customerName CHAR(10), --顾客姓名
    currentMoney MONEY     --当前余额
)
GO
 
/*---添加约束:根据银行规定,帐户余额不能少于1元,除非销户----*/
ALTER TABLE bank
  ADD CONSTRAINT CK_currentMoney CHECK(currentMoney>=1)
GO
 
/*--插入测试数据:张三开户,开户金额为800 ;李四开户,开户金额1 ---*/
INSERT INTO bank(customerName,currentMoney) VALUES('张三',1000)
INSERT INTO bank(customerName,currentMoney) VALUES('李四',1)
GO
--查看结果
SELECT * FROM bank
 
GO
 
/*--转帐测试:张三希望通过转账,直接汇钱给李四1000元--*/
--我们可能会这样这样写代码
--张三的帐户少1000元,李四的帐户多1000元
UPDATE bank SET currentMoney=currentMoney-1000
     WHERE customerName='张三'
UPDATE bank SET currentMoney=currentMoney+1000
     WHERE customerName='李四'
GO
--再次查看结果,结果发现了什么严重的错误?如何解决呢?
SELECT * FROM bank
GO
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-22
  • 2022-12-23
  • 2022-12-23
  • 2021-10-15
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-21
相关资源
相似解决方案