AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-95549

Kristen Hammack's questions

Martin Hope
Kristen Hammack
Asked: 2017-01-26 07:29:24 +0800 CST

如果存在则锁定行,否则创建新记录

  • 3

我有一个包含“文档”元数据的表,我们称它为 DOCS。其他表指向元数据表的 ID,以构建文档的各个部分。

我想确保在我的应用程序中,我可以让一个人“签出”文档,以便他们是唯一可以编辑它的人。(当然,应用程序内置了覆盖机制)。

所以我的想法是在 DOCS 表中有一列 LockedBy,如果文档被锁定,它会保存一个用户 ID。

我希望应用程序只需要使用一个存储过程来进行插入和更新,所以我目前正在使用给定的 @DOCID 并执行“upsert”:

UPDATE DOCS
SET column=@param
WHERE ID=@DOCID;
IF @@ROWCOUNT=0 --@@ROWCOUNT will be 0 if the update fails
BEGIN
    INSERT INTO DOCS(columnnames)
    VALUES(@newvalues);
    SET @DOCID=SCOPE_IDENTITY();
END

但是既然要加锁机制,就需要通过某种方式来检测doc是否存在,有没有被别人加锁,同时考虑到并发的可能性。

如果我做:

BEGIN TRANSACTION TR1
IF EXISTS(
    SELECT * 
    FROM DOCS WITH(HOLDLOCK,ROWLOCK)
    WHERE ID=@DOCID)
BEGIN
    IF NOT EXISTS(SELECT * FROM DOCS WHERE ID=@DOCID AND LockedBy=@Editor)
    RETURN -1 --return "error" code to app
END
ELSE
--create row here

--finally do all the updates to secondary tables
COMMIT TRANSACTION TR1
  1. SELECT从事务到结束,该行是否会被锁定?如果我在最后一个ELSE子句中创建行,我是否需要做类似的事情INSERT INTO DOCS WITH(HOLDLOCK,ROWLOCK)?
  2. 有一个更好的方法吗?
sql-server locking
  • 1 个回答
  • 433 Views
Martin Hope
Kristen Hammack
Asked: 2017-01-25 12:45:33 +0800 CST

Sql Server 中的事务/锁

  • 4

我有一个表,它有一个“LockedBy”字段,它可以是空的(没有人锁定这条记录进行编辑),也可以有一个用户 ID。

这个想法是让只有一个团队成员可以一次“检查”记录(以及与该记录相关的其他表中的所有记录),这在我的脑海中听起来很容易,直到我意识到我真的不知道锁定如何处理 SQL Server 中的事务。

目前,我正在使用事务更新表并在存储过程中保存点,但我不知道如何合并“锁”:

BEGIN TRANSACTION TR1
BEGIN TRY

    UPDATE LOCK_TABLE SET UpdatedDate=GETDATE() WHERE ID=@ID
    --======================================================================
    --only update this table if the lock field is null; make sure no one 
    --else can modify the lock field until the whole of TR1 is committed
    --or rolled back
    --======================================================================


    --Table 1   
    SAVE TRANSACTION TR2
    BEGIN TRY
        UPDATE TABLE1 SET somefield='something' WHERE LockTableID=@ID
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION TR2;
        PRINT ERROR_MESSAGE();
    END CATCH

    COMMIT TRANSACTION TR1;
    --======================================================================
    --release the lock
    --======================================================================
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION TR1;
    SET @RETURN=-1;
    PRINT ERROR_MESSAGE();
END CATCH

我从并发编程的角度理解锁,但是每个 SQL Server 对锁的介绍似乎要么是关于防止死锁,要么是关于如何使用不同粒度的锁。

我想我想要的只是“从这里到这里,不要让其他人执行这个存储过程”(就像多线程函数中的锁),但也许我是从错误的角度来的。

当我使用事务时,SQL Server 会自动执行我想要的操作吗?或者我需要添加一些特殊的东西,以便我可以锁定对该存储过程的其他调用?

sql-server locking
  • 2 个回答
  • 2638 Views
Martin Hope
Kristen Hammack
Asked: 2016-10-15 10:45:02 +0800 CST

如何设置开发服务器 SQL Server

  • 1

我的 .NET 开发团队最近进行了大规模重组,重组的结果是,我们现在有能力执行诸如设置源代码管理和数据库备份以及开发数据库之类的事情。但是,我们都不是真正的 DBA,因此我们不知道如何在数据库端执行此操作。

我们希望有一些方法可以让开发人员可以使用真实数据进行测试,但无法更改生产服务器上的数据。现在,我们只有一个数据库,所以如果我们需要测试对网站的更改,我们必须制作虚拟记录来测试。

基本上,我们知道这是一个糟糕的设置,但我们不知道更好,我们真的很想改变。我在网上找不到任何内容来概述如何实际设置可用于应用程序开发和数据库开发的开发环境。

我看过如何开发数据库(工作流程)?以及如何为小型网络团队设置本地数据库开发流程?,但第一个没有解决我的问题,第二个假定了很多我没有的知识。我对“正常”数据库开发实践、推出/回滚脚本、如何编写数据库开发测试、模式比较工具等一无所知(这些都是我在搜索中看到的术语,但我不知道不知道去哪里了解它们。)

有谁知道我可以去哪里了解这些东西?和/或任何人都可以给我一些关于如何设置我不知道如何描述的环境的建议吗?

我的团队非常反对使用 TFS。我不确定为什么(我自己从未使用过它),但他们喜欢 Git,而我知道 Git,所以这是我们决定的源代码控制。我的主要问题实际上是如何为不同的环境设置单独的服务器,同时在开发中使用当前数据。

sql-server development
  • 2 个回答
  • 1423 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve