存储过程与事务

USE BOOK
GO
--删除表
IF OBJECT_ID(‘tb_Money‘) IS NOT NULL
DROP TABLE tb_Money
GO
--创建表
CREATE TABLE tb_Money(
 Id INT IDENTITY(1,1) PRIMARY KEY,
 Name VARCHAR(50) NOT NULL,
 MyMoney DECIMAL NOT NULL
)
--插入数据
INSERT INTO dbo.tb_Money (  Name, MyMoney )VALUES  (‘刘备‘, 100 )
INSERT INTO dbo.tb_Money (  Name, MyMoney )VALUES  (‘关羽‘, 20 )

--事务开始
BEGIN TRAN Tran_Money
DECLARE @tran_error INT;
SET @tran_error = 0;
DECLARE @FromPeple VARCHAR(50);
DECLARE @ToPeple VARCHAR(50);
DECLARE @HowMoney DECIMAL;
SET @FromPeple = ‘关羽‘;
SET @ToPeple = ‘刘备‘;
SET @HowMoney = 30;
BEGIN TRY
IF (((SELECT MyMoney FROM dbo.tb_Money WHERE Name = @FromPeple) - @HowMoney) < 0)
  BEGIN
       PRINT ‘余额不足‘;
       SET @tran_error = @tran_error + 1;
  END
ELSE
  BEGIN
      UPDATE dbo.tb_Money SET MyMoney = MyMoney - 30 WHERE Name = @FromPeple ;
	  SET @tran_error = @tran_error + @@ERROR;
	  UPDATE dbo.tb_Money SET MyMoney = MyMoney + 30 WHERE Name = @ToPeple ;
	  SET @tran_error = @tran_error + @@ERROR;
  END
END TRY
BEGIN CATCH
  PRINT ‘出现异常,错误编号:‘ + CONVERT(VARCHAR,ERROR_NUMBER()) + ‘错误消息:‘ + ERROR_MESSAGE()
  SET @tran_error = @tran_error + 1
END CATCH
IF(@tran_error > 0)
BEGIN
   ROLLBACK TRAN;--
   PRINT ‘转账失败,取消交易‘
END
ELSE
BEGIN
  COMMIT TRAN;
  PRINT ‘转账成功‘
END

--转账存储过程
IF OBJECT_ID(‘Pro_TranMoney‘) IS NOT NULL
DROP PROCEDURE Pro_TranMoney
GO
CREATE PROCEDURE Pro_TranMoney
@FromPeple VARCHAR(50),
@ToPeple VARCHAR(50),
@HowMoney DECIMAL
AS
BEGIN
--存储过程中的事务
--事务开始
BEGIN TRAN Tran_Money
DECLARE @tran_error INT;
SET @tran_error = 0;
BEGIN TRY
IF (((SELECT MyMoney FROM dbo.tb_Money WHERE Name = @FromPeple) - @HowMoney) < 0)
  BEGIN
       PRINT ‘余额不足‘;
       SET @tran_error = @tran_error + 1;
  END
ELSE
  BEGIN
      UPDATE dbo.tb_Money SET MyMoney = MyMoney - 30 WHERE Name = @FromPeple ;
	  SET @tran_error = @tran_error + @@ERROR;
	  UPDATE dbo.tb_Money SET MyMoney = MyMoney + 30 WHERE Name = @ToPeple ;
	  SET @tran_error = @tran_error + @@ERROR;
  END
END TRY
BEGIN CATCH
  PRINT ‘出现异常,错误编号:‘ + CONVERT(VARCHAR,ERROR_NUMBER()) + ‘错误消息:‘ + ERROR_MESSAGE()
  SET @tran_error = @tran_error + 1
END CATCH
IF(@tran_error > 0)
BEGIN
   ROLLBACK TRAN;--
   PRINT ‘转账失败,取消交易‘
END
ELSE
BEGIN
  COMMIT TRAN;
  PRINT ‘转账成功‘
END
END

--测试转账存储过程
EXEC dbo.Pro_TranMoney @FromPeple = ‘刘备‘,@ToPeple = ‘关羽‘, @HowMoney = 30

  

时间: 2024-08-08 02:41:01

存储过程与事务的相关文章

sql存储过程和事务的应用

在去年,学习数据库的时候就学过存储过程了.一直都只知道一些理论,却不知道如何去使用.时隔一年,终于找到如何使用存储过程了. 在机房收费系统中,有些操作,需要多次执行sql语句,多次执行完成才算是完成这个事件流.但是如果其中有一个环节出了错误,那么没出错误的那些操作是不是就多余了. 执行存储过程,就是执行多句SQl语句.而事务,是为了控制这些语句 要么都做,要么 都不做. 在机房收费系统中,执行sql语句的时候. 一般的sql语句使用方法:定义一个字符串,用于存放sql语句.之后指明command

mysql存储过程之事务篇

mysql存储过程之事务篇 事务的四大特征: ACID:Atomic(原子性).Consistent(一致性).Isolated(独立性).Durable (持久性) MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: sql代码  1. MyISAM:不支持事务,用于只读程序提高性能 2. InnoDB:支持ACID事务.行级锁.并发 3. Berkeley DB:支持事务 事务隔离级别标准: ANSI(美国国家标准学会)标准定义了4个隔离级别,MySQL的InnoDB都

Mysql存储过程包含事务,且传入sql数据执行

有一个需求是:在一个图片按钮上点击,在按钮的上方弹出一个弹框,根据弹框的内容页面做不同的显示.这个其实没什么难的,主要是要控制好弹框的显示位置,让弹框显示在图片的正上方的中间. 一开始是用的Popupwindow,但是Popupwindow不能给弹窗之外的页面加一个半透明的蒙层,当然可以在页面上加一个专门的作为蒙层的View,但是很显然,这么做会代码变得很恶心,于是又换成了Dialog,因为Dialog弹出的时候会自动加一个蒙层的,但是这个时候,弹框显示位置的Y坐标不对了,后来一顿查,原来Dia

一个简单的存储过程使用事务的例子

在存储过程中使用事务时非常重要,使用数据库可以保持数据的关联完整性,在SQL Server存储过程中使用事务也很简单,举个例子: Create Procedure MyProcedure ( @Param1 nvarchar(10), @Param2 nvarchar(10) ) AS Begin Set NOCUNT ON; Set XACT_ABORT on; Begin Tran Delete from table1 where name='abc'; insert into table2

存储过程带事务,拼接id,返回值

出处:http://www.cnblogs.com/cmsdn/archive/2012/04/25/2469568.html 以下SQL以防以后还需用到,特此备份 删除一条留言信息会级联删除回复信息,这时我们需要用到事务,如下SQL 1 ALTER PROCEDURE [dbo].[proc_tb_leaveword_delete] 2 ( 3 @leavewordID INT, 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 BEGIN TRY 9 B

Java-JDBC调用批处理、存储过程、事务

一.使用Batch批量处理数据库  当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率.; 1.实现批处理有两种方式,第一种方式: Statement.addBatch(sql)  list 执行批处理SQL语句 executeBatch()方法:执行批处理命令 clearBatch()方法:清除批处理命令 例: Connection conn = null; Statement st = null; ResultSet rs =

mysql之——存储过程 + 游标 + 事务

下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: DELIMITER $$ DROP PROCEDURE IF EXISTS `transferEmailTempData`$$ CREATE PROCEDURE transferEmailTempData(IN jobId VARCHAR(24)) BEGIN DECLARE idval VARCH

存储过程和事务创建

/*alter 修改*/create proc InsertOrder @OrderCode nvarchar(50), @CusId int as begin begin tran--开启事务 begin try --计算总金额 declare @totalPri decimal(8,2) select @totalPri=sum(price*[count]) from carinfo where cusid=@CusId --向主表插入数据 insert into ordermaster(o

mysql中的存储过程和事务隔离

※存储过程存储过程是保存在数据库上的一段可执行代码.1.定义存储过程的语法是:Create procedure sp_name (参数..)Begin SQL语句End;2.调用它的方法:Call sp_name(参数-); //空参时则括号中不填内容 3.演示1)不带参数定义(delimiter用于定义结束符):DELIMITER $$CREATE PROCEDURE p1()BEGIN INSERT INTO person2 VALUES('P05','李四',0); SELECT * FR