SQLServer中的存储过程与事务

[复制链接]
发表于 2025-6-16 11:43:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、存储过程的概念

1. 界说

存储过程(Stored Procedure)是一组预编译的 SQL 语句的集合,它们被存储数据库中,可以通过指定存储过程的名称并实验来调用它们。存储过程可以担当输入参数、输出参数,并且可以返回实验结果。
2. 优点 



  • 性能提升:存储过程在创建时会被编译,之后调用时直接实验预编译的代码,淘汰了编译时间。
  • 淘汰网络流量:客户端只需发送存储过程的名称和参数,淘汰了网络传输的数据量。
  • 代码复用:存储过程可以被多个应用步调重复调用,提高了代码的复用性。
  • 安全:通过存储过程可以限定用户对某些表或数据的直接访问,提高了数据的安全性。
  • 事务管理:存储过程可以封装复杂的业务逻辑,包括事务的提交和回滚,确保数据的同等性。
3. 创建存储过程 

  1. USE [数据库名];
  2. GO
  3. CREATE PROCEDURE [架构名].[存储过程名]
  4.     @参数1 数据类型 = 默认值,
  5.     @参数2 数据类型 OUTPUT -- 表示输出参数
  6. AS
  7. BEGIN
  8.     SET NOCOUNT ON; -- 防止返回结果集中的行计数
  9.     -- SQL 语句
  10.     SELECT * FROM 表名 WHERE 条件;
  11.    
  12.     -- 如果有输出参数,为输出参数赋值
  13.     SET @参数2 = 值;
  14.    
  15.     -- 返回状态
  16.     RETURN 0;
  17. END
  18. GO
复制代码
4. 调用存储过程

不带参数
  1. EXEC [架构名].[存储过程名];
复制代码
带输入参数
  1. EXEC [架构名].[存储过程名] @参数1 = 值;
复制代码
带输出参数
  1. DECLARE @输出参数 数据类型;
  2. EXEC [架构名].[存储过程名] @参数1 = 值, @参数2 = @输出参数 OUTPUT;
  3. SELECT @输出参数;
复制代码
二、事务的概念

1. 界说

事务(Transaction)是一组操纵的集合,这些操纵要么全部成功,要么全部失败。事务是一个不可分割的工作单位,它确保了数据的完备性和同等性。
2. ACID 特性



  • 原子性(Atomicity):事务中的全部操纵要么全部完成,要么全部不完成,不会停留在中心状态。
  • 同等性(Consistency):事务实验前后,数据库都必须保持同等性状态。
  • 隔离性(Isolation):并发实验的事务之间不能互干系扰,一个事务的实验不能被其他事务干扰。
  • 持久性(Durability):一旦事务提交,其对数据库的更改将永世保存,即使体系发生故障也是云云。
3. 事务的语句 



  • BEGIN TRANSACTION:开始一个事务。
  • COMMIT TRANSACTION:提交事务,使全部操纵永世生效。
  • ROLLBACK TRANSACTION:回滚事务,撤销全部操纵。
已完成推理
详细解释SQL Server存储过程和事务
现在,我须要详细分析用户想要学习 SQL Server 存储过程和事务的意图。用户表示要将这些内容做笔记并教给别人,这就要求我的解释必须全面、详细,并且示例要清楚易懂。
首先,我得从存储过程的基本概念入手。我回忆起存储过程是 SQL Server 中用于存储一组预编译的 SQL 语句的集合,就像是一个代码包,能被反复调用。我得把这个核心概念用简朴直白的语言描述出来,让用户能快速捉住重点。
接着,我思考存储过程的优点,这能资助用户明白为什么我们要使用存储过程。我想到代码复用、性能提升、安全性增强、淘汰网络流量这几个关键点,这些都是存储过程带来的实着实在的好处,我得把这些优点一一列举出来,让用户明白其价值。
然后,我得讲解存储过程的创建和实验方式。我回忆起创建存储过程的语法,包括基本语法、带输入参数和带输出参数的语法。我决定用具体示例展示每一种情况,如许用户可以更直观地看到如何将理论应用到实践中。
随后,我转向事务的部分。我深知事务是数据库操纵的重要构成部分,它能保证数据的同等性和完备性。我得先解释事务的概念,再阐明它的四个关键特性:原子性、同等性、隔离性、持久性。
接下来,我考虑如何解释事务的隔离级别。我得详细描述每个隔离级别,比如未提交读、已提交读、可重复读、串行化,以及它们如何影响事务间的交互。同时,我得提供设置事务隔离级别的语法示例,让用户能亲自实践。
最后,我得给出完备的示例,展示如何在存储过程中使用事务。这包括事务的开始、提交、回滚的示例,让用户能清楚明白事务的使用流程。
在构思回答的过程中,我始终关注如何让内容更易于明白和影象。我制止使用过于复杂的术语,而是用通俗易懂的语言来解释。我还考虑如何将这些内容构造成易于阅读的布局,方便用户做笔记。
现在,我认为我已经充实准备好了,可以开始以一种逻辑清楚、易于明白的方式给用户一个详细的解释,包罗全面的概念、优点、语法、示例等,资助用户把握 SQL Server 的存储过程和事务。
好的,下面我将详细描述 SQL Server 数据库中存储过程的概念、用法以及事务的相干知识,方便你做笔记和辅导他人。
一、存储过程的概念

1. 界说

存储过程(Stored Procedure)是一组预编译的 SQL 语句的集合,它们被存储在数据库中,可以通过指定存储过程的名称并实验来调用它们。存储过程可以担当输入参数、输出参数,并且可以返回实验结果。
2. 优点



  • 性能提升:存储过程在创建时会被编译,之后调用时直接实验预编译的代码,淘汰了编译时间。
  • 淘汰网络流量:客户端只需发送存储过程的名称和参数,淘汰了网络传输的数据量。
  • 代码复用:存储过程可以被多个应用步调重复调用,提高了代码的复用性。
  • 安全性:通过存储过程可以限定用户对某些表或数据的直接访问,提高了数据的安全性。
  • 事务管理:存储过程可以封装复杂的业务逻辑,包括事务的提交和回滚,确保数据的同等性。
3. 创建存储过程

sql
复制
  1. USE [数据库名];
  2. GO
  3. CREATE PROCEDURE [架构名].[存储过程名]
  4.     @参数1 数据类型 = 默认值,
  5.     @参数2 数据类型 OUTPUT -- 表示输出参数
  6. AS
  7. BEGIN
  8.     SET NOCOUNT ON; -- 防止返回结果集中的行计数
  9.     -- SQL 语句
  10.     SELECT * FROM 表名 WHERE 条件;
  11.    
  12.     -- 如果有输出参数,为输出参数赋值
  13.     SET @参数2 = 值;
  14.    
  15.     -- 返回状态
  16.     RETURN 0;
  17. END
  18. GO
复制代码
4. 调用存储过程



  • 不带参数
    sql 复制
    1. EXEC [架构名].[存储过程名];
    复制代码
  • 带输入参数
    sql 复制
    1. EXEC [架构名].[存储过程名] @参数1 = 值;
    复制代码
  • 带输出参数
    sql 复制
    1. DECLARE @输出参数 数据类型;
    2. EXEC [架构名].[存储过程名] @参数1 = 值, @参数2 = @输出参数 OUTPUT;
    3. SELECT @输出参数;
    复制代码
二、事务的概念

1. 界说

事务(Transaction)是一组操纵的集合,这些操纵要么全部成功,要么全部失败。事务是一个不可分割的工作单位,它确保了数据的完备性和同等性。
2. ACID 特性



  • 原子性(Atomicity):事务中的全部操纵要么全部完成,要么全部不完成,不会停留在中心状态。
  • 同等性(Consistency):事务实验前后,数据库都必须保持同等性状态。
  • 隔离性(Isolation):并发实验的事务之间不能互干系扰,一个事务的实验不能被其他事务干扰。
  • 持久性(Durability):一旦事务提交,其对数据库的更改将永世保存,即使体系发生故障也是云云。
3. 事务的语句



  • BEGIN TRANSACTION:开始一个事务。
  • COMMIT TRANSACTION:提交事务,使全部操纵永世生效。
  • ROLLBACK TRANSACTION:回滚事务,撤销全部操纵。
4. 事务隔离级别

 事务隔离级别控制事务之间的相互影响程度,SQL Server 提供了以下隔离级别:


  • READ UNCOMMITTED:允许脏读,事务可以读取其他事务未提交的数据。
  • READ COMMITTED:只允许读取已提交的数据,默认隔离级别。
  • REPEATABLE READ:可重复读,确保在事务中多次读取同一数据时结果同等。
  • SERIALIZABLE:可串行化,最高隔离级别,事务之间完全隔离。
三、存储过程与事务结合示例 

  1. USE OEM;
  2. GO
  3. -- 创建存储过程
  4. CREATE PROCEDURE [dbo].[TransferFunds]
  5.     @FromAccount INT,
  6.     @ToAccount INT,
  7.     @Amount DECIMAL(18, 2)
  8. AS
  9. BEGIN
  10.     SET NOCOUNT ON;
  11.    
  12.     -- 声明变量
  13.     DECLARE @FromBalance DECIMAL(18, 2);
  14.     DECLARE @ToBalance DECIMAL(18, 2);
  15.     DECLARE @Result INT;
  16.     -- 设置事务隔离级别
  17.     SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
  18.     -- 开始事务
  19.     BEGIN TRY
  20.         BEGIN TRANSACTION;
  21.         -- 检查源账户余额
  22.         SELECT @FromBalance = Balance FROM Accounts WHERE AccountID = @FromAccount;
  23.         IF @FromBalance < @Amount
  24.         BEGIN
  25.             SET @Result = -1; -- 余额不足
  26.             THROW 50001, '源账户余额不足', 1;
  27.         END
  28.         -- 扣除源账户金额
  29.         UPDATE Accounts SET Balance = Balance - @Amount WHERE AccountID = @FromAccount;
  30.         -- 增加目标账户金额
  31.         UPDATE Accounts SET Balance = Balance + @Amount WHERE AccountID = @ToAccount;
  32.         -- 提交事务
  33.         COMMIT TRANSACTION;
  34.         SET @Result = 0; -- 成功
  35.     END TRY
  36.     BEGIN CATCH
  37.         -- 回滚事务
  38.         IF @@TRANCOUNT > 0
  39.         BEGIN
  40.             ROLLBACK TRANSACTION;
  41.         END
  42.         -- 捕获错误信息
  43.         DECLARE @ErrorMessage NVARCHAR(4000);
  44.         DECLARE @ErrorSeverity INT;
  45.         DECLARE @ErrorState INT;
  46.         SELECT
  47.             @ErrorMessage = ERROR_MESSAGE(),
  48.             @ErrorSeverity = ERROR_SEVERITY(),
  49.             @ErrorState = ERROR_STATE();
  50.         -- 返回错误信息
  51.         RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
  52.         SET @Result = -2; -- 事务失败
  53.     END CATCH
  54.     -- 返回结果
  55.     RETURN @Result;
  56. END
  57. GO
复制代码
示例阐明


  • 事务隔离级别:设置为 READ COMMITTED,确保只读取已提交的数据。
  • 错误处理:使用 TRY...CATCH 块捕获错误,并在发生错误时回滚事务。
  • 结果返回:通过返回值和 RAISERROR 提供错误信息。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表