2017-07-21 1 views
1

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

+0

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

+0

@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

Répondre

3

tout ce qui est après Begin Tran sera exécuté en totalité ou en tout sera fail..So votre clause valeurs ne fonctionnera pas non ..

à partir des documents officiels (Non souligné)

BEGIN TRANSACTION représente un point auquel les données référencées par une connexion sont logiquement et physiquement cohérentes. En cas d'erreur, toutes les modifications de données effectuées après BEGIN TRANSACTION peuvent être annulées pour renvoyer les données à cet état de cohérence connu.

il n'a pas d'importance, si vous clause VALUES ou séparée DML, tout échoueront ..

Je me demande si j'utilise seule instruction INSERT avec plusieurs valeurs, est-il d'insérer 2 rangée Assurez-vous à une transaction?

même si vous ne l'employez pas que les déclarations entières entre ces deux clauses seront logiquement dans une transaction

valeurs par ailleurs l'article est juste du sucre syntactique, il fonctionne comme séparés les instructions d'insertion sous le capot, vous pouvez voir même en bas d'écran

enter image description here

+0

Je suis d'accord que la transaction peut annuler des choses entières. Alors voulez-vous dire quoi que ce soit que j'utilise la «clause de valeurs» ou «séparer», la transaction fonctionnera pareil? – ddangi

+0

oui, c'est juste.voir à jour – TheGameiswar

+1

Il est très utile pour moi. Merci! – ddangi