Je souhaite m'assurer d'insérer 2 lignes à la fois. Si j'exécute 2 INSERT
requêtes en même temps comme celui-ciComment la transaction fonctionnera en INSERT unique avec plusieurs valeurs dans SQL Server
CREATE TABLE [dbo].[Table_test2]
(
[column1] [int] NOT NULL ,
[column2] [int] NOT NULL ,
PRIMARY KEY(column1, column2)
)
-- column1 & column2 = primary key
--query 1
BEGIN TRAN
INSERT INTO Table_test(column1, column2) VALUES (1,1)
INSERT INTO Table_test(column1, column2) VALUES (2,2)
COMMIT TRAN
--query 2
BEGIN TRAN
INSERT INTO Table_test(column1, column2) VALUES (2,2)
INSERT INTO Table_test(column1, column2) VALUES (1,1)
COMMIT TRAN
Je pense que les deux query1 et query2 échouera. Parce que la table déverrouillera après la première instruction INSERT
, query1 et query2 réussiront à insérer la première ligne. Mais lorsque chaque requête insère la deuxième instruction INSERT
, cela ne fonctionne pas correctement.
Donc, je vais changer la requête comme ça. Est-ce que c'est bon?
Si la première requête fonctionne correctement, la deuxième requête peut être ignorée.
--query 1
BEGIN TRAN
INSERT INTO Table_test(column1, column2) VALUES (1,1), (2,2)
COMMIT TRAN
--query 2
BEGIN TRAN
INSERT INTO Table_test(column1, column2) VALUES (2,2), (1,1)
COMMIT TRAN
Je me demande si j'utilise seule instruction INSERT
avec plusieurs valeurs, est-il assurer l'insertion de 2 ligne à une transaction?
p.s. désolé, je ne suis pas bon en anglais
Si vous attendez concurrence et de la concurrence pourquoi ne pas construire d'anticiper l'accord? Votre application peut/doit utiliser un intermédiaire pour gérer le concours. Vous pouvez utiliser une procédure stockée qui retournera un message d'erreur amical si l'insertion échoue. Ou insérez-le dans une table de transfert qui ne possède pas les contraintes de clé et dont le processus passe de l'environnement de transfert à la table principale. Ou vous pourriez laisser la deuxième insertion échouer et laisser la couche d'application gérer les erreurs – theo
@theo Merci pour votre attention. Ouais, je sais que je peux utiliser le verrou au niveau de l'application ou gérer les erreurs en cas de problème. Je veux juste savoir le travail de transaction SQL comme je le pensais? – ddangi