码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server 事务与锁

时间:2019-02-02 17:18:07      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:upd   script   ESS   class   const   alt   ber   compute   begin   

事务

事务就是作为一个逻辑工作单元的SQL语句,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上个节点。为了确保要么执行,要么不执行,就可以使用事务。而锁是实现事务的关键,锁可以保证事务的完整性和并发性。

技术图片

代码实例

技术图片
USE [MyDataBase]
GO
/****** Object:  Table [dbo].[Money]    Script Date: 2019/2/2 17:07:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Money](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Money] [decimal](18, 0) NOT NULL,
 CONSTRAINT [PK_tb_Money] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET IDENTITY_INSERT [dbo].[Money] ON 

INSERT [dbo].[Money] ([ID], [Name], [Money]) VALUES (1, N张三, CAST(1000 AS Decimal(18, 0)))
INSERT [dbo].[Money] ([ID], [Name], [Money]) VALUES (2, N李四, CAST(1000 AS Decimal(18, 0)))
SET IDENTITY_INSERT [dbo].[Money] OFF
数据库脚本

 技术图片

技术图片
BEGIN TRAN Tran_Money;
    --开始事务
  DECLARE @tran_error INT;
  SET @tran_error = 0;
  BEGIN TRY 
    UPDATE  dbo.Money
    SET     Money = Money - 30
    WHERE   Name = 张三;
    SET @tran_error = @tran_error + @@ERROR;
        --测试出错代码,看看张三的钱减少,李四的钱是否会增加
        --SET @tran_error = 1;
    UPDATE  dbo.Money
    SET     Money = Money + 30
    WHERE   Name = 李四;
    SET @tran_error = @tran_error + @@ERROR;
  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
转账事务

数据库中的锁也是为了解决在并发访问时出现各种冲突的一种机制

技术图片

锁的目的是什么?

主要解决多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:

  • 丢失更新,同时修改一条数据
  • 读脏,A修改了数据后,B读取后A又取消了修改,B读脏
  • 不可重复读,A用户读取数据,随后B用户读取该数据并修改,此时A用户再读取数据时发现前后两次的值不一致
  • 还有一种是幻读,这个情况好像不多。

并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致

 锁的粒度有哪些?

  • 数据库锁:锁定整个数据库,这通常发生在整个数据库模式改变的时候。
  • 表锁:锁定整个表,这包含了与该表相关联的所有数据相关的对象,包括实际的数据行(每一行)以及与该表相关联的所有索引中的键。
  • 区段锁:锁定整个区段,因为一个区段由8页组成,所以区段锁定是指锁定控制了区段、控制了该区段内8个数据或索引页以及这8页中的所有数据行。
  • 页锁:锁定该页中的所有数据或索引键。
  • 行或行标识符:虽然从技术上将,锁是放在行标识符上的,但是本质上,它锁定了整个数据行。

SQL Server 事务与锁

标签:upd   script   ESS   class   const   alt   ber   compute   begin   

原文地址:https://www.cnblogs.com/cnki/p/8715522.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!