`

数据库中事务使用实例

 
阅读更多
1.数据库的事务很重要,在保持数据一致性有很大的用处
USE [DNN ]
GO
/****** Object:  StoredProcedure [dbo].[aspnet_Membership_ResetPassword]    Script Date: 01/16/2015 11:05:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[aspnet_Membership_ResetPassword]
    @ApplicationName             nvarchar(256),
    @UserName                    nvarchar(256),
    @NewPassword                 nvarchar(128),
    @MaxInvalidPasswordAttempts  int,
    @PasswordAttemptWindow       int,
    @PasswordSalt                nvarchar(128),
    @CurrentTimeUtc              datetime,
    @PasswordFormat              int = 0,
    @PasswordAnswer              nvarchar(128) = NULL
AS
BEGIN
    DECLARE @IsLockedOut                            bit
    DECLARE @LastLockoutDate                        datetime
    DECLARE @FailedPasswordAttemptCount             int
    DECLARE @FailedPasswordAttemptWindowStart       datetime
    DECLARE @FailedPasswordAnswerAttemptCount       int
    DECLARE @FailedPasswordAnswerAttemptWindowStart datetime

    DECLARE @UserId                                 uniqueidentifier
    SET     @UserId = NULL

    DECLARE @ErrorCode     int
    SET @ErrorCode = 0

    DECLARE @TranStarted   bit
    SET @TranStarted = 0

    IF( @@TRANCOUNT = 0 )
    BEGIN
	    BEGIN TRANSACTION
	    SET @TranStarted = 1
    END
    ELSE
    	SET @TranStarted = 0

    SELECT  @UserId = u.UserId
    FROM    dbo.aspnet_Users u, dbo.aspnet_Applications a, dbo.aspnet_Membership m
    WHERE   LoweredUserName = LOWER(@UserName) AND
            u.ApplicationId = a.ApplicationId  AND
            LOWER(@ApplicationName) = a.LoweredApplicationName AND
            u.UserId = m.UserId

    IF ( @UserId IS NULL )
    BEGIN
        SET @ErrorCode = 1
        GOTO Cleanup
    END

    SELECT @IsLockedOut = IsLockedOut,
           @LastLockoutDate = LastLockoutDate,
           @FailedPasswordAttemptCount = FailedPasswordAttemptCount,
           @FailedPasswordAttemptWindowStart = FailedPasswordAttemptWindowStart,
           @FailedPasswordAnswerAttemptCount = FailedPasswordAnswerAttemptCount,
           @FailedPasswordAnswerAttemptWindowStart = FailedPasswordAnswerAttemptWindowStart
    FROM dbo.aspnet_Membership WITH ( UPDLOCK )
    WHERE @UserId = UserId

    IF( @IsLockedOut = 1 )
    BEGIN
        SET @ErrorCode = 99
        GOTO Cleanup
    END

    UPDATE dbo.aspnet_Membership
    SET    Password = @NewPassword,
           LastPasswordChangedDate = @CurrentTimeUtc,
           PasswordFormat = @PasswordFormat,
           PasswordSalt = @PasswordSalt
    WHERE  @UserId = UserId AND
           ( ( @PasswordAnswer IS NULL ) OR ( LOWER( PasswordAnswer ) = LOWER( @PasswordAnswer ) ) )

    IF ( @@ROWCOUNT = 0 )
        BEGIN
            IF( @CurrentTimeUtc > DATEADD( minute, @PasswordAttemptWindow, @FailedPasswordAnswerAttemptWindowStart ) )
            BEGIN
                SET @FailedPasswordAnswerAttemptWindowStart = @CurrentTimeUtc
                SET @FailedPasswordAnswerAttemptCount = 1
            END
            ELSE
            BEGIN
                SET @FailedPasswordAnswerAttemptWindowStart = @CurrentTimeUtc
                SET @FailedPasswordAnswerAttemptCount = @FailedPasswordAnswerAttemptCount + 1
            END

            BEGIN
                IF( @FailedPasswordAnswerAttemptCount >= @MaxInvalidPasswordAttempts )
                BEGIN
                    SET @IsLockedOut = 1
                    SET @LastLockoutDate = @CurrentTimeUtc
                END
            END

            SET @ErrorCode = 3
        END
    ELSE
        BEGIN
            IF( @FailedPasswordAnswerAttemptCount > 0 )
            BEGIN
                SET @FailedPasswordAnswerAttemptCount = 0
                SET @FailedPasswordAnswerAttemptWindowStart = CONVERT( datetime, '17540101', 112 )
            END
        END

    IF( NOT ( @PasswordAnswer IS NULL ) )
    BEGIN
        UPDATE dbo.aspnet_Membership
        SET IsLockedOut = @IsLockedOut, LastLockoutDate = @LastLockoutDate,
            FailedPasswordAttemptCount = @FailedPasswordAttemptCount,
            FailedPasswordAttemptWindowStart = @FailedPasswordAttemptWindowStart,
            FailedPasswordAnswerAttemptCount = @FailedPasswordAnswerAttemptCount,
            FailedPasswordAnswerAttemptWindowStart = @FailedPasswordAnswerAttemptWindowStart
        WHERE @UserId = UserId

        IF( @@ERROR <> 0 )
        BEGIN
            SET @ErrorCode = -1
            GOTO Cleanup
        END
    END

    IF( @TranStarted = 1 )
    BEGIN
	SET @TranStarted = 0
	COMMIT TRANSACTION
    END

    RETURN @ErrorCode

Cleanup:

    IF( @TranStarted = 1 )
    BEGIN
        SET @TranStarted = 0
    	ROLLBACK TRANSACTION
    END

    RETURN @ErrorCode

END

2.事务会锁定数据库表在使用时一定要注意,查询语句加上不锁表
 SELECT @IsLockedOut = IsLockedOut,
           @LastLockoutDate = LastLockoutDate,
           @FailedPasswordAttemptCount = FailedPasswordAttemptCount,
           @FailedPasswordAttemptWindowStart = FailedPasswordAttemptWindowStart,
           @FailedPasswordAnswerAttemptCount = FailedPasswordAnswerAttemptCount,
           @FailedPasswordAnswerAttemptWindowStart = FailedPasswordAnswerAttemptWindowStart
    FROM dbo.aspnet_Membership WITH ( UPDLOCK )

  IF (EXISTS (SELECT *
                    FROM  dbo.aspnet_Membership m WITH ( UPDLOCK, HOLDLOCK )
                    WHERE ApplicationId = @ApplicationId AND LoweredEmail = LOWER(@Email)))
0
7
分享到:
评论

相关推荐

    VisualC++数据库编程技术与实例沈炜著3

    《Visual C++数据库编程技术与实例》是一本深入探讨如何使用Microsoft Visual C++进行数据库编程的专业书籍,由沈...不过,这些章节标题通常会反映出书中涵盖的具体技术点,如“ODBC连接数据库”、“ADO使用实例”等。

    Visual C++数据库开发经典实例精解.pdf

    - 介绍在Visual C++中使用嵌入式数据库技术,比如SQLite,它们允许在应用中直接集成数据库功能,无需额外的数据库服务器。 7. 网络数据库编程 - 讨论如何在Visual C++中进行网络数据库编程,包括利用TCP/IP协议与...

    有关数据库事务回滚机制实例

    在探讨数据库事务回滚机制实例之前,我们先来理解一下什么是数据库事务以及为什么需要事务管理。数据库事务(Transaction)是指一组逻辑操作单元,这组操作要么全部成功,要么全部失败,是一个不可分割的工作单位。...

    C++数据库编程技术与实例.

    《C++数据库编程技术与实例》这本书正是为了帮助开发者掌握如何在C++环境中与数据库进行交互而编写的。 首先,C++数据库编程的基础涉及到对SQL(结构化查询语言)的理解,这是与所有关系型数据库进行沟通的语言。...

    数据库编程技术与实例

    通过学习“数据库编程技术与实例”,你将能够掌握数据库的基础知识,编写高效的SQL,设计和优化数据库,以及解决实际项目中的问题。实践案例会进一步加深对这些概念的理解,帮助你在实际工作中更好地应用数据库技术...

    VC数据库编程实例-ORACLE数据库VC数据库编程实例

    本实例主要关注如何使用VC++与Oracle数据库进行交互,实现数据的存取、查询、更新和删除等操作。Oracle数据库是一个关系型数据库管理系统,提供了丰富的API和工具,如OCI(Oracle Call Interface)和ODBC(Open ...

    数据库经典五实例

    - 在开始之前,你需要了解如何创建一个数据库,例如在MySQL中使用`CREATE DATABASE`语句。接着,创建表,定义字段类型、大小、约束(如主键、外键),使用`CREATE TABLE`语句。 2. **数据插入、查询与更新**: - ...

    使用事务管理删除数据库记录 编程小实例,

    本编程小实例将探讨如何在C++.NET环境中使用事务管理来安全地删除数据库记录。本文将深入解析这个主题,并提供具体的代码示例。 首先,我们需要理解事务的基本概念。事务是数据库系统执行的一系列操作的逻辑单元,...

    Visual C++ 数据库编程技术与实例

    书中会详细介绍如何配置ODBC数据源,以及如何在C++中使用ODBC函数连接和操作数据库。 4. **ADO(ActiveX Data Objects)**:ADO是微软提供的更高级的数据访问技术,它提供了更简单、更直观的方式来处理数据库。通过...

    数据库及其相关技术实例

    在本实例中,18个数据库实例可能涵盖了从基本的CRUD(创建、读取、更新、删除)操作到复杂的事务处理、并发控制、查询优化等高级主题。这些实例可能包括使用ADO连接数据库、执行SQL语句、填充Recordset对象、处理...

    数据库实例开发源代码

    在这些实例中,开发者可能使用了MFC(Microsoft Foundation Classes)库,它为VC++提供了封装好的数据库操作类,如CDatabase和CRecordset,简化了数据库操作。 实例代码可能涵盖了以下知识点: 1. 数据库连接:...

    MySQL数据库基础与实例教程所有资源

    在MySQL中,你可以使用CREATE DATABASE语句创建新的数据库,然后使用USE语句切换到要操作的数据库。表是数据库中的基本单元,CREATE TABLE语句用于定义表结构,包括字段名、数据类型、长度以及约束条件等。常见的...

    C#数据库实例、C#数据库实例

    在C#中,我们通常使用ADO.NET(ADO.NET Framework)来处理数据库操作,它提供了丰富的类库,如SqlConnection、SqlCommand、SqlDataReader等,方便程序员连接SQL Server数据库,执行查询、更新、插入和删除等操作。...

    关系数据库管理系统实例.ppt

    关系数据库管理系统实例是指使用关系模型来管理和存储数据的数据库管理系统。这种系统可以管理大量的数据,并提供了高效的数据存储和检索能力。关系数据库管理系统实例可以分为多种类型,如 Oracle、SQL Server、...

    Visual C++数据库编程技术与实例 附带光盘代码

    书中会详细讲解如何使用这些技术进行数据查询、插入、更新和删除操作,以及如何处理事务和错误。 再者,本书可能包含了一些数据库设计的基本概念,如ER模型(实体关系模型)、数据库模式设计和SQL(结构化查询语言...

    VisualC++数据库编程技术与实例沈炜著1

    《Visual C++数据库编程技术与实例》是一本深入探讨如何使用Visual C++进行数据库编程的专业书籍,由作者沈炜撰写。这本书旨在为读者提供丰富的编程技术知识,并通过大量的源码实例来帮助理解和应用这些技术。以下是...

    vb.net数据库连接实例

    本实例将详细讲解如何在VB.NET中建立与数据库的连接,进行数据操作,并确保程序的稳定性和安全性。 首先,我们需要引入ADO.NET组件,这是.NET Framework提供的用于访问数据库的一组类库。在VB.NET项目中,我们可以...

    数据库SQL实例

    数据库SQL实例,特别是T-SQL编程,是数据库管理和开发中的核心技能。T-SQL,全称为Transact-SQL,是Microsoft SQL Server所采用的一种扩展的SQL语言,它在标准SQL的基础上增加了一些特性和功能,使得数据库操作更为...

    C#数据库编程实例大全,包括22个经典例子

    以上只是C#数据库编程的部分核心概念,实际的实例可能涵盖了这些知识点的应用,包括但不限于创建数据库连接、执行查询、处理结果、事务管理以及错误处理等方面。这些实例对于学习和掌握C#数据库编程技巧非常有价值,...

    数据库事务处理实例图解

    数据库事务处理

Global site tag (gtag.js) - Google Analytics