xml地图|网站地图|网站标签 [设为首页] [加入收藏]
SqlServer查询存储过程中包含指定的内容,查找未
分类:数据库

1.事务的概念

事物是一种机制,是一种操作序列,它包含了数据库一组操作命令,这组命令要么全部执行,要么都不执行。因此事物是一组不可分割的事物逻辑单元,在数据库进行并发操作时候,事物是作为最小的控制单元来使用的,这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。

存储过程太多,有时只记得存储过程里面的某一点类容,想要找到对应的存储过程:

 

2.事物的4大属性

  • 原子性:事物是一个完整的操作;
  • 隔离性:对数据进行修改的所有并发事物都是彼此隔离的;
  • 一致性:当事物完成时,事物必须处于一致的状态;
  • 持久性:事物完成后,对于系统的影响是永久的;

SELECT obj.Name 存储过程名, sc.TEXT 存储过程内容

在SQL Server中,索引是优化SQL性能的一大法宝。但是由于各种原因,索引会被当做“银弹”滥用,一方面有些开发人员(甚至是部分数据库管理员)有一些陋习,不管三七二十一,总是根据所谓的"感觉"或“经验”先增加一些索引,而不管这些索引是否未被使用或是否合理。另外一方面在数据库的生命周期中,需求总是在变化,业务也在变化,有些当初创建的有效索引可能已经变成了unused index了。变成了数据库性能的累赘; 另外,部分数据库管理员其实很少清理索引(冗余索引,重复索引,未使用索引)。其实不管是出于性能考虑,还是数据库维护管理的需要,数据库中的未使用索引(unused index)都需要定期清理,因为这些未使用索引(unused index)不但不会提高查询性能,还会影响DML操作的性能、浪费存储空间等等。本文主要总结一下,如何找到识别、查找哪些未使用的索引(unused index)

3.创建事物

  • 开始事物:transaction begin
  • 提交事物:commit transaction
  • 回滚事物:rollback transaction

FROM syscomments sc

 

4.事物的分类

  • 显示事物:用begin transaction 明确指定事物的开始,用commit transaction, rollback transaction来结束或者回滚事务
  • 隐示事物(自动提交事物):隐式事务则在执完语句后自动提交事务

INNER JOIN sysobjects obj ON sc.Id = obj.ID

 

5.事例

 实现转账操作,转账人出账和收账人入账是一组完整的操作序列,必须全部完成或不完成,准备一张用户钱包表(tbUserWallet),转账交易记录表(tbTransaction),简单设计如下

图片 1 图片 2

向用户钱包表(tbUserWallet)添加测试数据

图片 3

创建转账存储事物

USE [TEST]
GO

/****** Object:  StoredProcedure [dbo].[pAddTransaction]    Script Date: 2018/5/21 12:44:59 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:  yangyi
-- Create date: 18/05/21
-- Description: 转账
-- =============================================
CREATE PROCEDURE [dbo].[pAddTransaction]
@InOpenID uniqueidentifier,
@InTDesc nvarchar(50),
@OutOpenID uniqueidentifier,
@OutTDesc nvarchar(50),
@TAmount decimal(10, 2),
@TTID int,
@Result int output
AS
BEGIN
 IF((SELECT Amount FROM tbUserWallet WHERE OpenID=@OutOpenID)>=@TAmount)
 BEGIN
  BEGIN TRANSACTION
   BEGIN TRY
    UPDATE tbUserWallet SET Amount=Amount-@TAmount WHERE OpenID=@OutOpenID
    UPDATE tbUserWallet SET Amount=Amount+@TAmount WHERE OpenID=@InOpenID
    --SELECT 1+'A'
    INSERT INTO [dbo].[tbTransaction]([TID],[OpenID],[TAmount],[TTID],[TDesc],[CreateDT])VALUES(NEWID(),@InOpenID,@TAmount,@TTID,@InTDesc,GETDATE())
    INSERT INTO [dbo].[tbTransaction]([TID],[OpenID],[TAmount],[TTID],[TDesc],[CreateDT])VALUES(NEWID(),@OutOpenID,-@TAmount,@TTID,@OutTDesc,GETDATE())
   END TRY
   BEGIN  CATCH
    IF(@@TRANCOUNT>0)
    BEGIN
     SET @Result=-1
     PRINT '事物执行出错,回滚'
     ROLLBACK TRANSACTION
    END
   END CATCH
  IF(@@TRANCOUNT>0)
  BEGIN
   SET @Result=1
   PRINT '一切按预期计划执行'
   COMMIT TRANSACTION
  END
 END
 ELSE
 BEGIN
  PRINT '转账人金额不足'
  SET @Result=0
 END
END

GO

测试1>:转账人金额不足测试

USE [TEST]
GO

DECLARE @return_value int,
  @Result int

EXEC @return_value = [dbo].[pAddTransaction]
  @InOpenID = '1ccd524d-de62-47ca-87d3-38787b040ba3',
  @InTDesc = N'收到A的转账100',
  @OutOpenID = '2ccd524d-de62-47ca-87d3-38787b040ba3',
  @OutTDesc = N'转账给A100',
  @TAmount = 100,
  @TTID = 1,
  @Result = @Result OUTPUT

SELECT @Result as N'@Result'

GO

图片 4

测试2>:模拟事物出现错误,进行回滚

取消存储事物中的:SELECT 1+'A' 注释(模拟事物中发生错误)

USE [TEST]
GO

DECLARE @return_value int,
  @Result int

EXEC @return_value = [dbo].[pAddTransaction]
  @InOpenID = '2ccd524d-de62-47ca-87d3-38787b040ba3',
  @InTDesc = N'收到A的转账100',
  @OutOpenID = '1ccd524d-de62-47ca-87d3-38787b040ba3',
  @OutTDesc = N'转账给A100',
  @TAmount = 100,
  @TTID = 1,
  @Result = @Result OUTPUT

SELECT @Result as N'@Result'

GO

图片 5  

测试3.>执行成功测试,注释 SELECT 1+'A' 

USE [TEST]
GO

DECLARE @return_value int,
  @Result int

EXEC @return_value = [dbo].[pAddTransaction]
  @InOpenID = '2ccd524d-de62-47ca-87d3-38787b040ba3',
  @InTDesc = N'收到A的转账100',
  @OutOpenID = '1ccd524d-de62-47ca-87d3-38787b040ba3',
  @OutTDesc = N'转账给A100',
  @TAmount = 100,
  @TTID = 1,
  @Result = @Result OUTPUT

SELECT @Result as N'@Result'

GO

图片 6

 

WHERE sc.TEXT LIKE '%自己要查的内容%'

   如何找到未使用索引呢? 在ORACLE数据库中提供了监控索引使用情况的功能。虽然在SQL Server中没有提供此类功能,但是提供了DMV视图sys.dm_db_index_usage_stats ,关于这个视图,详细信息可以参考官方文档,下面仅仅介绍需要用到的几个字段

 

user_scans      用户查询执行的扫描次数。

user_seeks      用户查询执行的搜索次数。

user_lookups    用户查询执行的书签查找次数。

user_updates    通过用户查询执行的更新次数。这表示插入、 删除,更新的次数,而不是受影响的实际行数。

                例如,如果你删除在一个语句中的 1000行,此计数递增 1

                Number of updates by user queries. This includes Insert, Delete, and Updates representing

                number of operations done not the actual rows affected. For example, if you delete 1000

                rows in one statement, this count increments by 1

 

我们可以使用下面SQL语句查找当前数据库中的未使用索引(unused index):

 

本文由澳门新葡亰手机版发布于数据库,转载请注明出处:SqlServer查询存储过程中包含指定的内容,查找未

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文