MSSQL事务的存储过程

在酒店管理系统开发中,我们会创建房间表和房间类型表(房型表)这两个表,如下图所示:

房型表:RoomType

      
    
房间表:Room

首先这两个表的关系:Room是从表,RoomType是主表,两表有主外键关系,RoomType.rTypeId=Room.rTypeId

分析这两个表,我们会发现这样一个问题:在房间表和房型表管理中,当我们修改或者删除一个RoomType表,对应的Room表我们也要做修改和删除,那么我们怎么解决这个问题呢?首先可以在数据库中设置级联删除,或者利用触发器也可以解决、、、这些方法都有一定的弊端,在实际开发中,我们会采取使用事务来解决这个问题,这种方法简单而且开发效率高,容易维护。

要求:在删除RoomType的同时把Room表中存在该房型的也删除.

思路:在删除RooType的时候,我们通过RoomType.rTypeId=Room.rTypeId找到Room中存在该房型的记录,把也它删掉。

说明:删除不是把整条记录从数据库删除,是将数据标识改为1,0是代表未删除。

下面介绍删除的存储过程:

代码:

 ALTER procedure [dbo].[usp_DelToomType] --创建删除房型的存储过程
 @rTypeId int --房型参数
 as
 begin transaction --开始事务
  declare @error int --定义一个变量标识错误号
  update RoomType set rTypeIsDel=1 where rTypeId=@rTypeId --根据条件删除房型,rTypeIsDel=1标识删除,0标识未删除
  set @error+=@@ERROR
  if(@error<>0) --不等于0说明这一句执行出现错误
  rollback transaction --事务回滚
  update Room set roomIsDel=1 where rTypeId=@rTypeId --根据条件删除房间
  set @error+=@@ERROR
  if(@error<>0) --不等于0说明这一句执行出现错误
  rollback transaction --事务回滚
 else
   commit transaction --提交事务

最后,数据层直接调用存储过程的方法即可完成删除房型的同时把存在该房型的房间也删除。

(0)

相关推荐

  • SQLServer分布式事务问题

    一. 问题现象 在执行 SQL Server分布式事务时,在SQL Server 2005下收到如下错误: 消息 7391,级别 16,状态 2,过程 xxxxx,第 16 行 无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务. 在SQL Server 2000下收到如下错误: 该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务. [OLE/DB provider

  • Sqlserver 存储过程中结合事务的代码

    复制代码 代码如下: --方式一 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[USP_ProcedureWithTransaction_Demo]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[USP_ProcedureWithTransaction_Demo] GO -- ===================

  • c#实现sqlserver事务处理示例

    复制代码 代码如下: private static void ExecuteSqlTransaction(string connectionString)    {        using (SqlConnection connection = new SqlConnection(connectionString))        {            connection.Open();            SqlCommand command = connection.CreateC

  • Transactional replication(事务复制)详解之如何跳过一个事务

    在transactional replication, 经常会遇到数据同步延迟的情况.有时候这些延迟是由于在publication中执行了一个更新,例如update ta set col=? Where ?,这个更新包含巨大的数据量.在subscription端,这个更新会分解成多条命令(默认情况下每个数据行一个命令),应用到subscription上. 不得已的情况下,我们需要跳过这个大的事务,让replication继续运行下去. 现在介绍一下transactional replicatio

  • MSSQL 事务说明

    1.什么是事务:事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时事务是做为最小的控制单元来使用的.他包含的所有数据库操作命令作为一个整体一起向系提交或撤消,这一组数据库操作命令要么都执行,要么都不执行. 2.事务的语句 开始事物:BEGIN TRANSACTION 提交事物:COMMIT TRANSACTION 回滚事务:ROLLBACK TRANSACTION 3.事务的4个属性 ①原子性(Atomicity):事务中的所有元素作为一个整体提交或回滚,事务的个元素是不可分的,事务

  • 使用Sqlserver事务发布实现数据同步(sql2008)

    事务的功能在sqlserver中由来已久,因为最近在做一个数据同步方案,所以有机会再次研究一下它以及快照等,发现还是有很多不错的功能和改进的.这里以sqlserver2008的事务发布功能为例,对发布订阅的方式简要介绍一下操作流程,一方面做个总结备份,一方面与大家进行一下分享和交流.费话就不多说了,进入一下今天的正题:) 这里要说明一下环境:首先我在本地局域网内有两台安装有sqlserver2008的机器(注意:已发布的快照版本无法向老版本数据库兼容,意味着2008下创建的事务或快照发布,无法被

  • MSSQL事务的存储过程

    在酒店管理系统开发中,我们会创建房间表和房间类型表(房型表)这两个表,如下图所示: 房型表:RoomType             房间表:Room 首先这两个表的关系:Room是从表,RoomType是主表,两表有主外键关系,RoomType.rTypeId=Room.rTypeId 分析这两个表,我们会发现这样一个问题:在房间表和房型表管理中,当我们修改或者删除一个RoomType表,对应的Room表我们也要做修改和删除,那么我们怎么解决这个问题呢?首先可以在数据库中设置级联删除,或者利用

  • 浅析SQL Server中包含事务的存储过程

    先来看一个概念: 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行.那么在存储过程里添加事务,则可以保证该事务里的所有sql代码要么完全执行要么完全不执行. 举个简单的带事务的存储过程: Begin Set NOCOUNT ON; --不返回影响行数 Set XACT_ABORT ON; --使用存储过程执行事务需要开启XACT_ABORT参数(默认为OFF) delete from table1 where n

  • PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解

    [PHP Source Code]: 复制代码 代码如下: $dbh = new PDO('sqlsrv:server=连接地址;Database=数据库名', 用户名, 密码);try { $procName = "P_Test_GetMixData"; $stmt = $dbh->prepare("EXEC $procName ?, ?, ?"); $nReturnValue = 0; $strReturnValue = ""; $st

  • 在ASP.NET 2.0中操作数据之六十六:在TableAdapters中使用现有的存储过程

    导言: 在前面的文章里我们考察了如何让TableAdapters向导自动的创建存储过程.而在本文,我们将考察如何让TableAdapter使用现有的存储过程.由于Northwind数据库现有的存储过程很少,我们也需要考察如何在Visual Studio环境里手动向数据库添加新的存储过程. 注意:在第61章<在事务里对数据库修改进行封装>里我们向TableAdapter添加了一些方法以支持事务(比如 (BeginTransaction, CommitTransaction等).我们可以在不修改数

  • ASP操作数据库的类

    今天俺在这裡给大家提供一种数据库操作的思路,这些代码是俺在长期的ASP应用中不断完成和修正的,也已经用它完成了很多项目了,应该说直接拿去用是没有问题的.当然本人能力也有限,希望大家一起来讨论. 说明:此帖代码均是VBScript版本.另外最好你对手写ASP已经有一定的基础. 先简单介绍一下俺这个类的一些特点: 可同时操作多个不同类型的数据库. 完全不用考虑数据类型的差别,再也不用想字符型字段加不加单引号. 调用非常简单,对数据库的主要操作一般只需要一行代码. 支持mssql事务回滚. 可自动生成

  • python 专题九 Mysql数据库编程基础知识

    在Python网络爬虫中,通常是通过TXT纯文本方式存储,其实也是可以存储在数据库中的:同时在WAMP(Windows.Apache.MySQL.PHP或Python)开发网站中,也可以通过Python构建网页的,所以这篇文章主要讲述Python调用MySQL数据库相关编程知识.从以下几个方面进行讲解: 1.配置MySLQ 2.SQL语句基础知识 3.Python操作MySQL基础知识 4.Python调用MySQL示例 一. 配置MySQL 首先下载mysql-5.0.96-winx64,安装

  • 全面了解ASP注入方法 [收集总结]

    1.判断是否有注入 ;and 1=1 ;and 1=2 2.初步判断是否是mssql ;and user>0 3.注入参数是字符 'and [查询条件] and ''=' 4.搜索时没过滤参数的 'and [查询条件] and '%25'=' 5.判断数据库系统 ;and (select count(*) from sysobjects)>0 mssql ;and (select count(*) from msysobjects)>0 access 6.猜数据库 ;and (Selec

  • 叶子asp分页类

    名称: 叶子asp分页类 Name: ShowoPage(vbs class) RCSfile: ReadMe.txt Revision: 0.12.20051114.f Author: Yehe(叶子) Released: 2005-11-14 09:40:13 Descript: ASP分页类,支持access/mssql/mysql/sqlite Contact: QQ:311673 MSN:myehe@msn.com GT:mmyehe@gmail.com WebSite: http:/

  • 全面认识ASP注入技巧

    复制代码 代码如下: 1.判断是否有注入  ;and 1=1  ;and 1=2 2.初步判断是否是mssql  ;and user>0 3.注入参数是字符  'and [查询条件] and ''=' 4.搜索时没过滤参数的  'and [查询条件] and '%25'=' 5.判断数据库系统  ;and (select count(*) from sysobjects)>0 mssql  ;and (select count(*) from msysobjects)>0 access

随机推荐