我想知道当涉及到 KEY 锁时,SQL Server 对于唯一非聚集索引和非唯一聚集索引的行为是否有所不同。
我有一个特殊的情况让我使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED. (我sp_getapplock用来确保单个进程访问给定的行。)
我正在尽力避免任何类型的锁定升级。我清楚地知道ISOLATION LEVEL READ UNCOMMITTED读取有什么作用,但我不确定删除。
我看到用做删除一些示例代码ROWLOCK和READPAST,连同ISOLATION LEVEL READ UNCOMMITTED但我是没有什么,会做明确的,所以我也没有一直在使用它了。
这是否需要防止我的删除锁定升级或就ISOLATION LEVEL READ UNCOMMITTED足够了?
我们处于这样的情况:选择被更新阻止。但表格不同。
UPDATE [dbo].[TABLE_1]
SET ...
SELECT [t1].[field]
FROM [dbo].[TABLE_1] AS [t1]
WHERE...
Run Code Online (Sandbox Code Playgroud)
当它们同时运行时,这个简单的过程会阻塞这个过程:
SELECT "A lot of fields"
FROM TABLE_TOTALLY_DIFFERENT
INNER JOIN [another table totally different]
ON...
WHERE...
Run Code Online (Sandbox Code Playgroud)
这对我来说毫无意义。
即使通过查看 pageID,我也可以看到在这种情况下被锁定的表是TABLE_TOTALLY_DIFFERENT.
但他们与他们无关。
我如何查找并确定它们被锁定的原因?
我想知道是否有任何关于保护数据库结构的更新?我们提供了一个使用 SQL 作为其主要 DBMS 的许可应用程序,我们希望锁定数据库结构(模式)。
我知道我可以自己加密数据和存储过程......等。我想要最佳实践来加密/保护/锁定来自终端客户端 DBA 的数据结构和关系。
在我们安装和修复应用程序时,我可以访问最终客户端物理服务器。
该应用程序是使用 linq to sql 用 C# 编写的
恐惧是使用数据库方案对解决方案进行逆向工程(并且已经发生过一次)。所以我们需要在安全的环境中运行我们的应用程序,它只使用本地数据库。
Microsoft 没有提供此功能:https : //docs.microsoft.com/en-us/sql/relational-databases/security/protecting-your-sql-server-intellectual-property?view=sql-server-2017
我想为 M 个用户自动保留 N 个对象的库存。
我有两张库存跟踪表,一张用于全球库存,一张用于个人库存。
有两个表,因为我必须为每个对象以及每个用户强制执行最大允许保留。例如,一个对象可能被限制为总共保留 1000 个,每个用户最多保留 10 个该对象。
全局清单表以 [ObjectID] 为唯一键,个人清单表以 [UserID, ObjectID] 为唯一键。
为 3 个对象保留库存的示例请求如下所示。一些对象有限制,而另一些则没有。
[
{ObjectID: 'A', QuantityToReserve: 1},
{ObjectID: 'C', QuantityToReserve: 2, GlobalMax: 1000, PersonalMax: 10},
{ObjectID: 'B', QuantityToReserve: 5}
]
Run Code Online (Sandbox Code Playgroud)
原子预留是通过启动一个事务,然后首先更新全局清单表中的行来实现的,对于所有对象 ID,按升序排列。
没有限制的对象的更新语句如下所示:
UPDATE [GlobalInventory] WITH (ROWLOCK, XLOCK, HOLDLOCK)
SET [Count] = [Count] + @QuantityToReserve
WHERE [ObjectID] = @ObjectID
Run Code Online (Sandbox Code Playgroud)
具有限制的对象的更新语句如下所示:
UPDATE [GlobalInventory] WITH (ROWLOCK, XLOCK, HOLDLOCK)
SET …Run Code Online (Sandbox Code Playgroud)