2009-04-15 8 views
0

Si j'ai plusieurs SPsAssurer la synchronisation des threads en SQL possible?

 
SP1 
SP2 
some_inline_queries 

comment puis-je assurer qu'ils sont tous courent à la fois sans interruption avec d'autres threads? Est-il possible de le faire à partir du niveau SQL Server?

modifier:

Disons que nous avons un script principal avec 3 actions principales:

sp1 scans table t1 pour générer une chaîne aléatoire qui est unique à la colonne c1 en T1;

sp2 fait des choses assez intensive;

une instruction insère la chaîne aléatoire retournée par sp1 dans c1 de la table t1. Donc, si j'exécute plusieurs instances de ce script principal simultanément, j'ai besoin que tous les contenus de t1.c1 soient distincts quand tous les scripts ont fini de s'exécuter.

Répondre

1

êtes-vous les exécuter dans une transaction? Je ne sais pas ce que vous entendez par « interruption », mais ils seraient en sécurité en supposant qu'ils sont dans un:

Begin Transaction MyTranNameHere 
exec sp1 
exec sp2 
some statement 
Commit Transaction MyTranNameHere 
+0

permettez-moi de savoir ce que vous voulez dire et peut-être que je pourrais répondre à mieux. – IEnumerator

+0

S'il vous plaît voir modifier dans OP. Merci pour l'aide. – Haoest

1

Si je vous comprends bien, vous voulez set the transaction isolation level à SERIALIZABLE. MSSQL En supposant a une vraie sérialisation (il ne pourrait pas, une vraie sérialisation est rarement nécessaire et souvent très coûteux à mettre en œuvre), cela garantit que même si vous exécutez plusieurs transactions à la fois, le résultat final sera identique à l'exécution d'un (bien qui on est généralement non-déterministe), en attendant qu'il se termine, puis en exécutant une autre transaction, et ainsi de suite. Attention toutefois: il y a souvent des "bugs" subtils, qu'ils soient réels ou non, dans les implémentations de la base de données SERIALIZABLE, car ce truc est vraiment difficile à obtenir. Surtout méchant est le fait que certaines bases de données basées sur MVCC (utiliser Oracle et PostgreSQL MVCC, et je sais que les listes Postgres discutaient récemment ces problèmes avec leur SGBD) ne mettent pas vraiment SERIALIZABLE parfaitement, va plutôt pour ce qui devrait être appelé isolement SNAPSHOT - Cela donne 99% des avantages de SERIALIZABLE avec un minimum de performance, mais ce n'est pas bien si vous tombez dans ce 1%.

Si SERIALIZABLE n'est pas une option, soit parce qu'il ne fait pas ce que vous voulez ou pour une autre raison, vous pouvez toujours demander à chaque SP de se verrouiller en exclusivité avant de faire son sale boulot. Cela peut entraîner des blocages ou des délais et nécessiter d'autres réglages ailleurs, donc c'est une sorte d'option moche, mais ça devrait faire l'affaire.

Questions connexes