Checking @@ROWCOUNT failing
I have a code similar to the one below in one of my SQL procedures,
declare @rowcount int
update table1
set value = @value
where id = @id
select @rowcount = @@ROWCOUNT
if ( @rowcount = 0 )
begin
insert into table1(id, value1,value2...)
select (@id, @value1, @value2...)
end
But it fails rarely, like once in a day etc. That means the data exists in the table and @@rowcount is 0 and it tried to insert data and primary key violation happening. Here all values which are inserting ie. id,value1,value2 etc are integers. Any thoughts?
sql-server locking primary-key
New contributor
add a comment |
I have a code similar to the one below in one of my SQL procedures,
declare @rowcount int
update table1
set value = @value
where id = @id
select @rowcount = @@ROWCOUNT
if ( @rowcount = 0 )
begin
insert into table1(id, value1,value2...)
select (@id, @value1, @value2...)
end
But it fails rarely, like once in a day etc. That means the data exists in the table and @@rowcount is 0 and it tried to insert data and primary key violation happening. Here all values which are inserting ie. id,value1,value2 etc are integers. Any thoughts?
sql-server locking primary-key
New contributor
add a comment |
I have a code similar to the one below in one of my SQL procedures,
declare @rowcount int
update table1
set value = @value
where id = @id
select @rowcount = @@ROWCOUNT
if ( @rowcount = 0 )
begin
insert into table1(id, value1,value2...)
select (@id, @value1, @value2...)
end
But it fails rarely, like once in a day etc. That means the data exists in the table and @@rowcount is 0 and it tried to insert data and primary key violation happening. Here all values which are inserting ie. id,value1,value2 etc are integers. Any thoughts?
sql-server locking primary-key
New contributor
I have a code similar to the one below in one of my SQL procedures,
declare @rowcount int
update table1
set value = @value
where id = @id
select @rowcount = @@ROWCOUNT
if ( @rowcount = 0 )
begin
insert into table1(id, value1,value2...)
select (@id, @value1, @value2...)
end
But it fails rarely, like once in a day etc. That means the data exists in the table and @@rowcount is 0 and it tried to insert data and primary key violation happening. Here all values which are inserting ie. id,value1,value2 etc are integers. Any thoughts?
sql-server locking primary-key
sql-server locking primary-key
New contributor
New contributor
edited 14 hours ago
Aaron Bertrand♦
153k18296492
153k18296492
New contributor
asked yesterday
blueblue
1192
1192
New contributor
New contributor
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
I'm not sure why you're using a variable, but you need to protect multiple statements with a transaction. What's happening is two users are calling the procedure at the same time, both are getting rowcount = 0, and then they're both trying to insert as a result.
set transaction isolation level serializable;
begin transaction;
update dbo.table1
set value = @value
where id = @id;
if (@@ROWCOUNT = 0)
begin
insert dbo.table1(id, value1,value2...)
values(@id, @value1, @value2...);
end
commit transaction;
Appreciate your answers! How about using IF EXISTS (select top 1 1 from table1 where id @id) then update and else Insert?
– blue
16 hours ago
1
@blue that pattern requires an extra access to the table (in the case where it exists). IF EXISTS essentially does the exact same thing the update does to try to locate the row - why do that twice?
– Aaron Bertrand♦
15 hours ago
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "182"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
blue is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f232558%2fchecking-rowcount-failing%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I'm not sure why you're using a variable, but you need to protect multiple statements with a transaction. What's happening is two users are calling the procedure at the same time, both are getting rowcount = 0, and then they're both trying to insert as a result.
set transaction isolation level serializable;
begin transaction;
update dbo.table1
set value = @value
where id = @id;
if (@@ROWCOUNT = 0)
begin
insert dbo.table1(id, value1,value2...)
values(@id, @value1, @value2...);
end
commit transaction;
Appreciate your answers! How about using IF EXISTS (select top 1 1 from table1 where id @id) then update and else Insert?
– blue
16 hours ago
1
@blue that pattern requires an extra access to the table (in the case where it exists). IF EXISTS essentially does the exact same thing the update does to try to locate the row - why do that twice?
– Aaron Bertrand♦
15 hours ago
add a comment |
I'm not sure why you're using a variable, but you need to protect multiple statements with a transaction. What's happening is two users are calling the procedure at the same time, both are getting rowcount = 0, and then they're both trying to insert as a result.
set transaction isolation level serializable;
begin transaction;
update dbo.table1
set value = @value
where id = @id;
if (@@ROWCOUNT = 0)
begin
insert dbo.table1(id, value1,value2...)
values(@id, @value1, @value2...);
end
commit transaction;
Appreciate your answers! How about using IF EXISTS (select top 1 1 from table1 where id @id) then update and else Insert?
– blue
16 hours ago
1
@blue that pattern requires an extra access to the table (in the case where it exists). IF EXISTS essentially does the exact same thing the update does to try to locate the row - why do that twice?
– Aaron Bertrand♦
15 hours ago
add a comment |
I'm not sure why you're using a variable, but you need to protect multiple statements with a transaction. What's happening is two users are calling the procedure at the same time, both are getting rowcount = 0, and then they're both trying to insert as a result.
set transaction isolation level serializable;
begin transaction;
update dbo.table1
set value = @value
where id = @id;
if (@@ROWCOUNT = 0)
begin
insert dbo.table1(id, value1,value2...)
values(@id, @value1, @value2...);
end
commit transaction;
I'm not sure why you're using a variable, but you need to protect multiple statements with a transaction. What's happening is two users are calling the procedure at the same time, both are getting rowcount = 0, and then they're both trying to insert as a result.
set transaction isolation level serializable;
begin transaction;
update dbo.table1
set value = @value
where id = @id;
if (@@ROWCOUNT = 0)
begin
insert dbo.table1(id, value1,value2...)
values(@id, @value1, @value2...);
end
commit transaction;
answered yesterday
Aaron Bertrand♦Aaron Bertrand
153k18296492
153k18296492
Appreciate your answers! How about using IF EXISTS (select top 1 1 from table1 where id @id) then update and else Insert?
– blue
16 hours ago
1
@blue that pattern requires an extra access to the table (in the case where it exists). IF EXISTS essentially does the exact same thing the update does to try to locate the row - why do that twice?
– Aaron Bertrand♦
15 hours ago
add a comment |
Appreciate your answers! How about using IF EXISTS (select top 1 1 from table1 where id @id) then update and else Insert?
– blue
16 hours ago
1
@blue that pattern requires an extra access to the table (in the case where it exists). IF EXISTS essentially does the exact same thing the update does to try to locate the row - why do that twice?
– Aaron Bertrand♦
15 hours ago
Appreciate your answers! How about using IF EXISTS (select top 1 1 from table1 where id @id) then update and else Insert?
– blue
16 hours ago
Appreciate your answers! How about using IF EXISTS (select top 1 1 from table1 where id @id) then update and else Insert?
– blue
16 hours ago
1
1
@blue that pattern requires an extra access to the table (in the case where it exists). IF EXISTS essentially does the exact same thing the update does to try to locate the row - why do that twice?
– Aaron Bertrand♦
15 hours ago
@blue that pattern requires an extra access to the table (in the case where it exists). IF EXISTS essentially does the exact same thing the update does to try to locate the row - why do that twice?
– Aaron Bertrand♦
15 hours ago
add a comment |
blue is a new contributor. Be nice, and check out our Code of Conduct.
blue is a new contributor. Be nice, and check out our Code of Conduct.
blue is a new contributor. Be nice, and check out our Code of Conduct.
blue is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Database Administrators Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f232558%2fchecking-rowcount-failing%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown