存储过程和事务3

上一篇 / 下一篇  2014-06-10 10:16:48 / 个人分类:数据

as
   
declare@startRowint, @endRowint
   
set@startRow = (@pageIndex - 1) * @pageSize +1
   
set@endRow = @startRow + @pageSize -1
   
select*from(
       
select*, row_number()over(orderbyidasc)asnumberfromstudent
    ) t
   
wheret.numberbetween@startRowand@endRow;

execpro_stu 2, 2;

 

 

Ø Raiserror

Raiserror返回用户定义的错误信息,可以指定严重级别,设置系统变量记录所发生的错误。

  语法如下:

Raiserror({msg_id | msg_str | @local_variable}
  {, severity,
state}
  [,argument[,…n]]
  [
withoption[,…n]]
)

 

   # msg_id:sysmessages系统表中指定的用户定义错误信息

   # msg_str:用户定义的信息,信息最大长度在2047个字符。

   # severity:用户定义与该消息关联的严重级别。当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。

   任何用户可以指定0-18直接的严重级别。只有sysadmin固定服务器角色常用或具有alter trace权限的用户才能指定19-25直接的严重级别。19-25之间的安全级别需要使用with log选项。

   # state:介于1127直接的任何整数。State默认值是1

raiserror('is error', 16, 1);
select*fromsys.messages;
--
使用sysmessages中定义的消息
raiserror(33003, 16, 1);
raiserror(33006, 16, 1);

 

事务

为什么用事务?

举个例子,你给王汇100元钱,那系统会给你的卡上减掉100元,给王加100元,如果系统刚运行到给你减少了100元的时候停电了或者除了什么其他故障,而这100元又没有打到王的卡上,这怎么办呢?就要用刀数据库中的事务,事务要么事务中的语句全部执行,如果又失败就全部不执行,就是说要么你减掉100元给王加100元,2条语句都执行,要么你也不扣掉100也不给王加,,通过rollback滚回到没有给你扣钱的时期,就是执行事务之前。

概念                                 

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQLC++Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

特性

事务是恢复和并发控制的基本单位。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(atomicity。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

实例

银行转账

利用存储过程来实现下面的应用:从一个账户转指定数额的款项到另一个账户中。*/

建表:

create table account(accountnum int,uname char(10),total float)           

insert into account values(1001,'u1',50000)

insert into account values(1002,'u2',1000) 

select * from account 

建存储过程:

CREATE PROCEDURE TRANSFER

@outAccount int, @inAccount int, @amount FLOAT AS 

DECLARE  @totalDeposit FLOAT

BEGIN TRANSACTION                  /*检查转出账户的余额*/                             SELECT @totalDeposit=total FROM ACCOUNT WHERE ACCOUNTNUM=@outAccount   

IF @totalDeposit IS NULL    /*转出账户不存在或账户中没有存款*/      

BEGIN

ROLLBACK TRANSACTION 

PRINT '转出账户不存在或账户中没有存款,不能操作!'       

RETURN      

END 

IF @totalDeposit<@amount   /*转出账户存款不足*/      

BEGIN

ROLLBACK TRANSACTION

PRINT '转出账户存款不足,不能操作!'    /* 建议使用函数RAISERROR('转出账户存款不足,不能操作!',10,1)   */

RETURN

END  

IF exists(SELECT * FROM ACCOUNT WHERE ACCOUNTNUM=@inAccount )    /*检查转入账户是否存在*/

BEGIN                  

UPDATE account SET total=total-@amount WHERE ACCOUNTNUM=@outAccount                              /*修改转出账户,减去转出额*/

UPDATE account SET total=total+@amount WHERE ACCOUNTNUM=@inAccount                                                   /*修改转入账户,增加转出额*/

COMMIT TRANSACTION                 /*提交转账事务*/         

PRINT '转账成功,谢谢使用本存储过程!'         

RETURN        

END    

ELSE       

BEGIN

ROLLBACK TRANSACTION 

PRINT '转入账户不存在,不能操作!'          

RETURN       

END 

执行存储过程:

exec transfer 1001,1002,10000   /*10000元从1001账户转入1002账户*/

exec transfer 1001,1002,60000 exec transfer 1003,1001,1000

exec transfer 1001,1004,10000

 


TAG: 事务 存储过程

 

评分:0

我来说两句

Open Toolbar