`

在存储过程中运用事务

 
阅读更多

在存储过程中运用事务


create database study
use study
 
create table peopleInfor  --用户信息表
(
ID int primary key identity(1001,1),--主键自动增长
name1 nvarchar(30),--用户名
YMoney   money default(0)--卡上剩余金额
)
create table peopleInfor_mx  --用户取款明细
(
mx_id int primary key identity(100001,1), --主键自动增长
mx_Money money ,  --取款或付款金额
mx_type nvarchar(20)  check (mx_type='取钱' or mx_type ='存钱'),--代表此条数据是 存钱,还是 取钱
peopleId int  foreign key (peopleID)references peopleInfor(id) not null
)
 
 
 
--创建一个基本的存储过程
create procedure pro_insert(@name nvarchar(30),@money money)as
begin 
  insert into peopleInfor(name1,YMoney)values(@name,@money)
end

--执行 存储过程。
exec pro_insert '赵刚',20000
exec pro_insert '王五',30000

--错误的例子模仿银行转账
create procedure pro_zhuangzhang 
 @name_Jin nvarchar(30),--转进账户名称
@name_chu nvarchar(30), --转出帐户名称
 @money money --转入钱数)
 as
begin tran  --开发事务
   declare @YMoney money --账上余额
   declare @chuID int --出款账号的ID
   declare @JinID int --进款账号的ID
    select  @YMoney=YMoney from peopleInfor where name1=@name_chu --获取账上余额
  if(@money<=@YMoney)--判断 账号余额 是否 大于等于 转款余额
   begin
            update peopleInfor set YMoney=YMoney-@money where name1=@name_chu  -- 从 出帐 帐户中减去 转出金额
         
            select @chuID=ID from  peopleInfor where name1=@name_chu     -- 获得出帐ID
            insert into peopleInfor_mx (mx_Money,mx_type,peopleId)values(@money,'取钱',@chuID) --把转出金额 插入明细 表中并标明是 取出的钱

            update peopleInfor set YMoney=YMoney+@money where name1=@name_Jin-- 在 进帐 帐户中加上 转出金额
         
            select @chuID=ID from  peopleInfor where name1=@name_Jin-- -- 获得出帐ID
            insert into peopleInfor_mx (mx_Money,mx_type,peopleId)values(@money,'存钱',@JinID)
            -- 此时 @JinID 为空时 ,不能插入此列。故软件报错。
        if @@error<>0
        begin
           rollback tran 
           
         end 
   end
commit tran --执行事务
GO

 

 

--对的例子 模仿银行转账
create procedure pro_zhuangzhang 
 @name_Jin nvarchar(30),--转进账户名称
@name_chu nvarchar(30), --转出帐户名称
 @money money --转入钱数)
 as
begin tran  --开发事务
   declare @YMoney money 
   declare @chuID int 
   declare @JinID int 
    select  @YMoney=YMoney from peopleInfor where name1=@name_chu
  if(@money<@YMoney)
   begin
            update peopleInfor set YMoney=YMoney-@money where name1=@name_chu
         
            select @chuID=ID from  peopleInfor where name1=@name_chu
            insert into peopleInfor_mx (mx_Money,mx_type,peopleId)values(@money,'取钱',@chuID)

            update peopleInfor set YMoney=YMoney+@money where name1=@name_Jin
         
            select @JinID=ID from  peopleInfor where name1=@name_Jin
            insert into peopleInfor_mx (mx_Money,mx_type,peopleId)values(@money,'存钱',@JinID)
        if @@error<>0
        begin
           rollback tran 
           
         end 
   end
commit tran --执行事务
GO


select * from peopleInfor
select * from peopleInfor_mx
delete from peopleInfor where id=1003
exec pro_zhuangzhang '赵刚','王五',20000

  '赵刚',20000
  '王五',30000

分享到:
评论

相关推荐

    oracle 事务 回滚 存储过程

    如果事务中的所有操作都成功,可以使用`COMMIT`语句提交事务;如果发生错误,则使用`ROLLBACK`语句撤销所有更改,保持数据一致性。 ### 外部事务与嵌套事务 在示例中,外部事务`OutOfProc`被显式开始,并调用了`...

    从数据库中存取图片 事务 存储过程

    在这个场景下,我们将探讨如何在2005 SQL Server环境下,利用Visual Studio 2005(VS2005)进行数据库操作,特别是涉及图片数据的存储和检索,以及如何运用事务和存储过程来确保数据的一致性和完整性。 首先,我们...

    MqSQL存储过程在项目中的运用demo.rar

    本项目“MqSQL存储过程在项目中的运用demo”就是一个针对初学者的示例,旨在帮助理解存储过程在实际操作中的应用。 首先,存储过程的创建:在MySQL中,你可以通过`CREATE PROCEDURE`语句定义一个存储过程。它通常...

    Oracle存储过程中使用临时表

    总结来说,Oracle存储过程中使用临时表是优化数据处理和提高性能的有效手段,正确理解和运用会话级和事务级临时表,能更好地满足复杂的业务需求。在设计和实现存储过程时,应根据具体的应用场景选择合适的临时表类型...

    pb调用存储过程

    在IT行业中,数据库操作是日常开发中的重要环节,而存储过程是数据库中一种高效、封装性强的预编译语句集合。本问题涉及到的是在PowerBuilder(简称Pb)环境中如何调用Oracle或SQL Server等数据库中的存储过程。以下...

    数据库触发器、存储过程、事务管理PPT

    原子性确保事务中的所有操作都作为单个单元执行;一致性保证事务结束后,数据库处于有效状态;隔离性防止并发事务之间的数据冲突;持久性意味着一旦事务提交,其效果将是永久的。 在实际应用中,事务管理常常涉及...

    Mysql-事务与存储过程.pdf

    在MySQL中,可以在存储过程中定义变量,并对其进行赋值。 **定义变量:** ```sql DECLARE var_name datatype [DEFAULT default_value]; ``` **示例:** ```sql DECLARE @myVariable INT DEFAULT 10; ``` **为变量...

    存储过程 详解 教程

    3. 事务管理:在存储过程中可以进行事务控制,确保数据的一致性。 4. 数据验证:在插入或更新数据前进行合法性检查。 5. 业务逻辑:实现部分业务规则,如计算订单总额、处理订单状态变化等。 六、注意事项 虽然...

    Mysql5存储过程中文详解

    存储过程在数据库管理系统中扮演着重要的角色,它允许开发者编写可重用的代码块,这些代码块可以执行一系列复杂的数据库操作。在MySQL5.0中,存储过程的引入极大地增强了数据库的功能性和灵活性。 ### 存储过程定义...

    5个不同的系统中的存储过程

    在IT行业中,存储过程是数据库管理系统(DBMS)中预编译的SQL语句集合,它们可以被封装为一个可重用的实体,并且在需要时执行。...在实际开发中,合理运用存储过程可以极大地提升系统的整体质量和性能。

    db2 存储过程实例

    在"DB2存储过程练习"文件中,可能包含了一系列的存储过程示例,如数据的插入、更新、查询等操作,这些实例可以帮助初学者更好地理解如何在实际项目中运用存储过程。 总结,DB2的存储过程是数据库开发的重要工具,...

    有关存储过程,触发器,事务,,,PPT

    在IT行业中,数据库管理和编程是至关重要的领域,而存储过程、触发器和事务是数据库管理系统中的核心概念。这里我们将深入探讨这些主题,并结合ASP.NET框架,理解它们在实际开发中的应用。 1. 存储过程: 存储过程...

    hibernate query调用oracle存储过程

    例如,调用存储过程时,可以将相关操作包裹在Transaction中,以便在出现错误时能够回滚事务。 总之,通过Hibernate的Query接口,我们可以方便地调用Oracle的存储过程和函数,实现复杂的业务逻辑。结合源码和数据库...

    数据库存储过程资料收集

    4. **事务管理**:在存储过程中方便地处理事务,确保数据一致性。 然而,存储过程也有其局限性,如调试困难、跨平台移植性差等。在设计和使用存储过程时,需要根据具体的应用场景和需求来权衡利弊。 在学习存储...

    SQL存储过程,触发器讲解及过程中要注意的内容

    3. **事务管理**:在存储过程中使用适当的事务管理,确保数据一致性。不正确的事务边界可能导致数据不一致。 4. **避免长时间运行**:长时间运行的存储过程或触发器可能会阻塞其他操作,影响系统性能。优化查询和...

    c#事务的运用

    在C#中调用这个存储过程: ```csharp public void SQLTran() { SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=...

    存储过程.zip

    在日常开发和维护中,了解并熟练运用MySQL和Oracle的存储过程对于提升数据库应用的性能和稳定性至关重要。通过分析和理解这些存储过程脚本,我们可以更好地理解数据处理逻辑,优化数据库设计,并在需要时进行修改或...

    oracle 存储过程

    - 在存储过程中,可以使用`BEGIN TRANSACTION`,`COMMIT`和`ROLLBACK`来管理事务,确保数据的原子性和一致性。 - `COMMIT`提交事务,`ROLLBACK`回滚事务,确保在出现错误时数据的正确状态。 7. **存储过程优化**...

    SQL server 2005 存储过程100个实例

    4. **事务处理**:学习如何在存储过程中管理事务,确保数据的一致性和完整性,例如BEGIN TRANSACTION、COMMIT、ROLLBACK等。 5. **游标**:在某些场合,需要逐行处理数据,存储过程中的游标能实现这一需求。 6. **...

Global site tag (gtag.js) - Google Analytics