这是我的标量函数:
ALTER FUNCTION [dbo].[GetInstrumentID]
(
@ParentDocumentID int
)
RETURNS varchar(14)
AS
BEGIN
Declare @InstrumentID varchar(14) = ''
Declare @FilingNumber int = 0
Select @InstrumentID = InstrumentID
From Documents
Where DocumentID = @Paren
我有一个脚本,我试图在SQL 2012上运行,它使用了FASTFIRSTROW提示,但在SQL 2012中不起作用。
SELECT
C.*, N.TemplatePath
FROM
Content C WITH (UPDLOCK, FASTFIRSTROW),
Nav_Menu N WITH (UPDLOCK, FASTFIRSTROW),
Nav_Menu Nb WITH (UPDLOCK, FASTFIRSTROW)
WHERE
C.NavMenuID = N.NavMenuID
AND
N.AncestorNav
我想实现一个原子事务,如下所示:
BEGIN TRAN A
SELECT id
FROM Inventory
WITH (???)
WHERE material_id = 25 AND quantity > 10
/*
Process some things using the inventory record and
eventually write some updates that are dependent on the fact that
that specific inventory record had sufficient quantity (greater than
我需要检查表中是否存在唯一(不是主键)字段,如果没有-插入它:
ID unqiueidentifier, --PK
name varchar(100),
otherID int --Unique
也许使用条件插入:
DECLARE @OtherID int
INSERT INTO TableA (OtherID)
SELECT @OtherID
WHERE NOT EXIST (SELECT * from TableA where OtherID = @OtherID)
SELECT MainID from TableA where OtherID = @OtherID
参考文献:
我需要什
我有一个Azure Function App。它在存储队列上接收大量日志。每个日志代表Azure数据库中需要使用状态更新的一行。由于函数App同时运行多个实例,因此可能会发生两个实例更新同一行但顺序错误的情况。因此,我需要锁定数据库中的特定行,如果另一个实例试图读取它,它必须等待该行被释放。最好的答案是,行锁定应该做到这一点。你能用EF实现这一点吗?也欢迎其他建议。 请注意,它不是EF内核,因此需要标准版本的支持。 public static class ProccesLogQueue
{
static SPOServiceConfiguration configuration =
如下所示: BEGIN TRAN A
SELECT id
FROM Inventory
WITH (???)
WHERE material_id = 25 AND quantity > 10
/*
Process some things using the inventory record and
eventually write some updates that are dependent on the fact that
that specific inventory record had sufficient quantity (greater than 10).
*/
我有一个存储过程来获取我想要的数据:
SELECT a.SONum, a.Seq1, a.SptNum, a.Qty1, a.SalUniPriP, a.PayNum, a.InvNum,
a.BLNum, c.ETD, c.ShpNum, f.IssBan
FROM OrdD a JOIN OrdH b ON a.SONum = b.SONum
LEFT JOIN Invh c ON a.InvNum = c.InvNum
LEFT JOIN cus d ON b.CusCod = d.CusCod
LEFT JOIN BL e ON a.BL
我有一个源表,它驱动第二个表的内容。我有两个或更多进程将为此运行(在where子句中添加不同的内容)。所有这些基本上都使用了下面的语句。不知何故,我在目标表中得到了副本。我目前没有指定隔离级别,也没有指定任何锁定提示。Server正在运行2005年,这是我无法更改的(我知道2008年的MERGE可能适用)。
INSERT INTO tableDst
(PK, ...)
SELECT src.PK, ...
FROM tableSrc src
LEFT JOIN tableDst dst ON src.PK = dst.PK
WHERE dst.PK IS NULL
这两个表位于不同的
所以我的程序是这样的
IF Exists ()
Select
Else
Set Transaction isolation level serializable
Begin Tran
If not exists()
Insert
Select
Commit Tran
当我同时运行proc时,我得到
"Transaction was deadlocked on lock resources with anothre process and has been chosen as the deadlock victim.."
这是故意的吗?我能不能让第二个过程等待
我有一个非常有趣的问题。
我有一个表,其中包含数据,如下所示: DVDSerialNumbers(ID,Create_Date,SerialNumber,CategoryID)
我的应用程序为DVD生成序列号,并且我有一个类似下面的SQL命令(由我的应用程序发出):
ExecuteQuery("select top {0} SerialNumber from DVDSerialNumbers where CategoryID = {1};" &
"delete from DVDSerialNumbers where ID in (select top{0} I
这里是小复制品:
create table dbo.t (id int primary key, v int);
insert into dbo.t values (1, 1), (2, 2);
create table dbo.s (id int primary key, v int);
insert into dbo.s values (1, 10);
go
create trigger dbo.tr_t__iou
on dbo.t
instead of update
as
begin
set nocount on;
exec sp_lock @@spid;
end;
go
u
我正在对Server中的隔离级别进行一些测试。首先,我用这种结构创建了一个名为test的表:
然后,我使用两个线程同时运行测试代码:
use test-db;
go
declare @count int = 0;
while @count<5000
begin
set transaction isolation level read committed;
begin transaction;
declare @max int;
select @max = coalesce(max(sequence_no),0) from test;
print @max;
在一个事务(比如T1)中使用HOLDLOCK或UPDLOCK都不会阻止来自另一个事务(比如T2)的读访问。
据我所知,在T1完成之前,HOLDLOCK将阻止T2进行更新/删除;而UPDLOCK将阻止T2进行更新/删除/插入。在这两种情况下,T2都将拥有对这些记录的读访问权限。
但是,同时使用这两种方法(如:HOLDLOCK, UPDLOCK)会阻止T2进行读访问。当我们同时使用它们时,到底会发生什么?
感谢你的洞察力
更新:
但这并不是我所看到的:
例如:
在查询1中:
begin tran
select * from tblTest WITH (UPDLOCK, HOLDLOCK)
WA
我在两个会话中分别有两个测试事务。假设这两个事务将同时运行。我尝试做的是让一笔交易在另一笔交易完成后正确插入发票编号。无重复项。我这样做了,如下。但是如果我在会话2中使用(tablockx)删除,它们将不再起作用。我在上网本上查了一下,但没有答案。有人能帮上忙吗?Serializable将不起作用,因为两个SELECT在这里是彼此独占的。谢谢。
在会话1中:
begin transaction
declare @i int
select @i=MAX(InvNumber) from Invoice
with(tablockx)
where LocName=
如何确保下面的语句没有竞争条件?
IF NOT EXISTS (select col1 from Table1 where SomeId=@SomeId)
INSERT INTO Table1 values (@SomeId,...)
IF NOT EXISTS (select col1 from Table2 where SomeId=@SomeId)
INSERT INTO Table2 values (@SomeId,...)
这足够了吗?
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
IF NOT EXISTS (
给定以下正在运行的事务:
begin tran t
select 1 from T(updlock) where id = 'id1'
waitfor delay '00:00:10'
update T set value = 'new' where id = 'id1'
commit tran t
如果在waitfor延迟内启动以下请求:
select value from T(updlock) where id = 'id1'
此请求将阻塞直到事务t完成,然后按预期返回结果new。
但是,如果我提出以下请求:
我想用SP中的SELECT语句锁定表中的一些行。我在SP里有交易。我想锁定我在开始TRANSACTION.So之后选择的所有行,我想在提交/回滚之后释放这些行。
我试过XLOCK,UPDLOCK,HOLDLOCK,但是它们都没有达到我的期望。
这是我的代码样本..。
BEGIN TRANSACTION
-- I WANT TO LOCK EMPLOYEES LIVE IN ISTANBULL
SELECT ID FROM EMPLOYEES WITH(XLOCK) WHERE CITY='ISTANBUL'
....
....
....
考虑到以下代码:
Set conn = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")
conn.BeginTrans
...
//This is the line it is about
RS.Open "SELECT a,b FROM c FOR UPDATE", conn, adOpenDynamic, adLockPessimistic
...
RS.Close
conn.CommitTrans
conn.Close
当我使用:
RS.Op
我有下面的代码,我对此有疑问。
Update Statement on Table 1
Update Statement on Table 2
Select Statement which include both the Table 1
现在,上面的代码将返回到应用程序。意味着它是应用程序的所有函数。
我经常在应用程序中出现死锁错误。
我有上百个用户,它一次取同一个表。因此,我必须确保在update语句完成之前,select语句不会触发或不会锁定update语句。
另一个疑问是,如果假设我正在更新一行&另一个用户尝试选择该表,那么他会得到死锁吗?(用户试图选择不在update语
对于下面的事务,我偶尔会收到死锁错误,当该事务同时被调用为相同的顺序时。
BEGIN TRANSACTION
IF EXISTS (SELECT orderID FROM [Orders]WHERE orderID=@OrderId)
BEGIN
UPDATE [Orders] SET
[orderXml] =@orderXml
,[updatedDateTime] = @updatedDateTime
WHERE
[orderId] = @OrderId AND @updatedDateTime >
使用SQL 2016。 我有一个订单表: OrderID int identity
NumberOfItems int 和一个Items表: ItemId int identity
OrderId int
DateUpdated datetime 创建订单并通过identity分配OrderId。然后,我必须从Items表中为它分配"Freshest“"NumberOfItems”项。最新的意思是,根据DateUpdated的日期,它们已经更新了最近一次。通过将项目的OrderId更新为相关的OrderId来“分配”项目。 我使用此SQL以事务性方式分配项(@OrderI
UPDATE dbo.A
SET StatusCode = 'booked'
, UpdateDate = GETDATE()
OUTPUT INSERTED.id INTO @TableVar
WHERE id = (
SELECT TOP 1 wq.id
FROM dbo.A AS wq
WHERE wq.statusCode = 'Claimed' and wq.id = 2
)
我需要将id等于2且statusCode等于'Claimed‘的表A更新为'booked’
是threads
我有一个小木屋的表格,其中一个小木屋被一个账户引用...
CHALET
------
int ChaletId PK
int Berth
ACCOUNT
-------
int AccountId PK
int ChaletId FK
小木屋一开始就没有引用。当用户购买小木屋时,代码需要找到一个未引用的小木屋,并将其分配给新创建的帐户。我认为返回的小屋需要有一个UPDLOCK,直到引用它的帐户已经提交,以便阻止并发购物者被分配到相同的小屋。
如何编写获取小屋的SELECT?我在想像这样的事情..
SELECT * FROM CHALET WITH (UPDLOCK) c
LEFT JOIN
在我的.NET web应用程序中,我有一个分为两部分的例程。大多数情况下,例程的两个部分都被一个接一个地调用,
var result = Method1(someParams);
var finalResult = Method2(result);
它们被分成两个,因为一个可以被调用,有时也可以不调用另一个。这两种方法都在内部查询来自表Table1的数据。由于上述两个方法的参数不同,它们运行的select查询也不同,但我希望锁定将由这两个方法中的任何一个选择的行,以便另一个方法在第一个查询它的方法完成之前无法选择它。由于选择的数据应该在以后更新,select查询使用UPDLOCK关键字,但如上
我有张桌子:
id status mod runat
1 0 null null
2 0 null null
3 0 null null
4 0 null null
同时,我对这个查询进行了两次调用。
UPDATE TABLE
SET
status = 1,
mod = GETDATE()
OUTPUT INSERTED.id
WHERE id = (
SELECT TOP (1) id
FROM TABLE
WHERE STATUS = 0
A
Postgresql允许我使用以下语法在选择行的同时锁定它:
select id, amount from table where id = 1234 for update
这允许我更新行,同时确保也想要更新同一行的并发读取将获得更新和正确的结果。
基本上我可以这样做(伪代码):
begin transaction
select id, amount from table where id = 1234 for update
if(amount == new_amount) then
delete from table where id = 1234;
else
update tabl
我们注意到这种奇怪的情况,即当指定WITH(UPDLOCK)时,不返回记录的查询将等待锁定。
查询非常简单,如
SELECT primaryKey FROM someTable WITH(UPDLOCK)
WHERE columA = 'A'
AND columnB BETWEEN 6 AND 8
AND columnC != 'C' ;
运行此查询的系统使用未提交的隔离级别读,我们不能更改该级别。
有没有一种方法,例如提示,不会让这个等待,但如果它会产生结果,仍然会锁定记录吗?
我注意到索引的使用与此有关,因为其他查询没有这种行为
在更新存储计数器的表的行方面,我面临一个很大的问题。我使用一个事务来获取值并更新它,并且我试图只锁定受影响的计数器行,以避免锁和死锁,但它不起作用。
这是一个简化的代码示例,我可以在这里再现错误:
CREATE TABLE _COUNTERS_
(
ID INT IDENTITY NOT NULL,
CODE VARCHAR(20) NOT NULL,
CVALUE INT NOT NULL DEFAULT 0,
CONSTRAINT PK_ID PRIMARY KEY CLUSTERED
(
ID ASC,
COD
考虑以下两个事务
T1
begin tran
set transaction isolation level read committed
select name from foo with (UPDLOCK) where id = 1 --L1
select blah from bar where id = 2 --L2
commit
T2
begin tran
set transaction isolation level serializable
select name from foo with (UPDLOCK) where id = 1 --L3
select blah from
通过赤裸的选择,我得到了正确的偶像
declare @iden table (pk int);
update top (1) lockDate with (UPDLOCK)
set dt = GETDATE()
output inserted.iden into @iden
where dt is null
select top (1) iden.pk
from @iden iden;
当我尝试将它放入存储过程中时,我总是得到0。
你知道我做错了什么吗?
DROP PROCEDURE addLockDate
CREATE PROCEDURE addLockDate
AS