美文网首页
sql server 同步表若干数据原子性 重复并发问题

sql server 同步表若干数据原子性 重复并发问题

作者: 吉凶以情迁 | 来源:发表于2024-10-28 08:38 被阅读0次

语句为

Insert  dbo.XXX(name) Select 'xxx' where not exists(Select 1 from  XXX where name='xxx')";

咋一看不可能重复,实际重复了,那肯定是并发问题了

解决思路有3种:
1.约束

  1. 开启事务 从而锁定

  2. 把同步语句改为merge更好

SET XACT_ABORT ON;

BEGIN TRANSACTION;

BEGIN TRY
    -- 检查并插入
    IF NOT EXISTS (
        SELECT 1 
        FROM xxx
        WHERE x= xxx
    )
    BEGIN
        INSERT INTO xxx

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;

    DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT;
    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH;

SET XACT_ABORT OFF;

try catch TRANSACTION

BEGIN TRY
    BEGIN TRANSACTION;

    -- 检查是否存在相同的 Name,如果不存在则插入
    IF NOT EXISTS (
        SELECT 1 
        FROM Axxx WITH (UPDLOCK, HOLDLOCK) 
        WHERE x= xxx
    )
    BEGIN
        INSERT INTO Axxx
        (xx)
        VALUES 
        (xx);
    END

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- 出现错误时回滚事务
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;

    -- 捕获错误信息
    DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT;
    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    -- 返回错误信息
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH;

merge

MERGE INTO Axx AS target
USING (SELECT x) AS source
ON target.x= source.x
WHEN NOT MATCHED THEN
    INSERT (name)
    VALUES (@name);


xxx

相关文章

  • java并发编程要点

    Java并发问题主要有三个核心概念:原子性,可见性,顺序性。 原子性 并发问题的原子性的概念和数据库事务的原子性是...

  • 并发专题目录贴

    并发一、并发一:JAVA并发模型 并发二、原子性、有序性、可见性 并发三、同步原语final、volatile的内...

  • 线程 - 草稿

    并发 资源的分配与调度 线程安全问题 多线程访问临界资源 解决思想 原子性 可见性 有序性 解决 同步互斥访问...

  • 三范式、存储引擎、事务

    数据库的三大范式 A:第一范式  数据库表中不能出现重复的记录,每个字段是原子性的不能再分 存在问题:1: 最后...

  • Sql Server事务语法及使用方法实例分析

    本文实例讲述了Sql Server事务语法及使用方法。分享给大家供大家参考,具体如下: 事务是关于原子性的。原子性...

  • 高并发原子性处理

    高并发原子性处理 场景:redis校验是否存在->存表 相同的请求1000次/s 发现表中存在多条数据 解决方式一...

  • SQL复制(导出)数据到excel表行数缺失问题的解决方案

    sql导数据出来缺失 之前在导数据时,从sql server数据库表中导出数据到excel表,数据量有几十到百万的...

  • Microsoft SQL Server数据库完整性约束、索引、

      本文介绍基于Microsoft SQL Server软件,实现数据库表完整性约束、索引与视图创建等操作的方法。...

  • 并发编程总结

    并发概念 并发变成三大特性 原子性 可见性 有序性 区分数据库事务四大特性:原子性、一致性、隔离性、持久性 线程的...

  • 2020-05-27 sqlserver复制表数据到另一个表

    sqlserver复制表数据到另一个表 SQL Server中,如果目标表存在: insert into 目标表 ...

网友评论

      本文标题:sql server 同步表若干数据原子性 重复并发问题

      本文链接:https://www.haomeiwen.com/subject/abrudjtx.html