Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
(Maybe) Parallel Madness!

 

Πόσες φορές μέχρι σήμερα δεν σας έτυχε να φτάσετε στα όρια της παράνοιας, της παραλίγο Ζαχαρίασης με την προοπτική της ανάγκης για μεταμόσχευση ύπατος πολύ κοντά, και όλα αυτά από ένα "bug" που απλά "Δεν γίνεται, δεν είναι λογικό"; Πολλές φαντάζομαι. Να ακόμη μία.

 Έρχεται που λέτε το email του πελάτη. "Αξιότιμοι κύριοι, όταν κάνω αυτό και αυτό τότε παίρνω αυτό και αυτό και σας παρακαλώ μπλα μλπα μπλα και δεν γίνεται μπλα μλπα μλπα... as soon as possible! Regards...". Το exception που έπερνε ήταν ένα sqlexception που μιλά για παραβίαση foreing key constraint.

 Χμ ας δούμε τι γίνεται. Κάνουμε αυτό και αυτό και... τίποτα! Το ξανακάνουμε... τιποτα! Δεν γίνεται, η αυτός έχει παρανοήσει ή εγώ τα εχω παίξει! Αλλά, το exception που μας έστειλε πού το βρήκε(Βλέπετε είμαστε σε beta, το exception handling δεν έχει ολοκληρωθεί ακόμα, μας έστειλε "ωμό" το exception που έφαγε, ντροπή...); Επικοινωνούμε και πάλι μαζί του να δούμε τι θα γίνει. "Ξέρετε", μας λεει "δεν μου ξανάτυχε από τότε, αλλά μου ξανασυνέβη την περασμένη βδομάδα. Συμβαίνει κάποιες φορές". Τί λεει αυτός; Περιστασιακά; Δεν γίνεται. Αν παραβιάζεται το foreing key constraint τότε παραβιάζεται κάθε φορά που καλείται η sp και όχι ... κάθε Παρασκευή! Αν δεν μπορώ να το αναπαράγω πώς θα το λύσω; Μάλλον θα του εκδώσω (του πελάτη) πιστοποιητικό παράνοιας τρίτου βαθμού. Αλλά το exception; WTF! Λες να έχουν παρανοήσει οι νόμοι της φύσης; Δεν γίνεται, ως απόλυτος ορθολογιστής ξέρω ότι κάτι συμβαίνει, κάτι πολύ κουφό η περίεργο... Ας δούμε λοιπόν τι έχουμε

Η sp που λέτε(στα πρόχειρα...):

BEGIN TRANSACTION

INSERT INTO TABLE1 (...)

VALUES (...)

IF @@ERRORCOUNT > 0

BEGIN

ROLLBACK TRANSACTION

END

INSERT INTO TABLE2(...)

VALUES(...)

IF @@ERRORCOUNT > 0

BEGIN

ROLLBACK TRANSACTION

END

COMMIT TRANSACTION

Ο TABLE2 έχει Foreing key constraint στο Primary του TABLE1. Το exception θα το φάμε μόνο αν το δεύτερο insert statement εκτελεστεί πρίν το πρώτο. Και πώς να γίνει αυτό; Εδώ ήταν που μου κατέβηκε η εξής ιδέα.

1) Ο SQL Server υποστηρίζει parallel query execution. Ενεργό by default

2) H sp έχει δυο statements.

3) Ο server είναι Dual Core. Άρα λογικά θα έχουμε παράλληλη εκτέλεση

Το execution plan της sp δινει 38% στο πρώτο statement και 62% στο δεύτερο. Άρα υπό κανονικές συνθήκες το πρώτο εκτελείται πάντα πριν το δεύτερο. Τώρα άν για οποιοδήποτε λόγο (bottleneck στον ένα από τους δύο επεξεργαστές) το δεύτερο εκτελεστεί πρίν το πρώτο τότε θα φάς exception! Είναι η μόνη λογική εξήγηση που σκέφτηκα. Τώρα το πώς λύνεται είναι απλό(νομίζω...). Απλά προσθέτεις ένα ELSE μετά το πρώτο IF. Έτσι υποχρεώνεις τον Server να εκτελέσει το πρώτο statement και αφότου επιτύχει τότε να προχωρήσει στο δεύτερο. Το πιο πάνω πάντως παραμένει εικασία μέχρι την αναίρεση της από το επόμενο exception (Φτου, φτου, φτου...)!

Γι αυτό, οιεσδήποτε άλλες εισηγήσεις ή παρατηρήσεις ευπρόσδεκτες! 

Share
Posted: Δευτέρα, 22 Οκτωβρίου 2007 8:54 πμ από το μέλος Pak

Σχόλια:

KelMan έγραψε:

Μου κάνει εντύπωση αυτό που περιγράφεις... Αν δεν κάνω λάθος, το parallel execution είναι per statement, όχι per procedure. Αν είναι per procedure καταργείται όλη η procedural λογική. Φαντάσου ένα quad system. Θα τρέξει παράλληλα σε τετράδες τα statements;

# Οκτωβρίου 27, 2007 12:21 μμ

Pak έγραψε:

Μπορεί να έχεις και δίκιο Μάνο! Δεν είμαι βέβαιος, είναι απλή υπόθεση... Αν η sp δεν έχει procedural λογική τότε τι θα εμποδίσει τον Server να εκτελέσει παράλληλα; Μπορείς να σκεφτείς άλλο τρόπο να εκτελεστεί το δεύτερο statement χωρίς να εκτελεστεί το πρώτο, δεδομένου του rollback στην περίπτωση του error; Παντως θα συνεχίσω τη διερεύνηση και αν βρώ κάτι θα επανέλθω...

# Οκτωβρίου 27, 2007 12:34 μμ

Pak έγραψε:

http://msdn2.microsoft.com/en-us/library/ms178065.aspx

Εδώ πάντως πάντως λέει ότι είναι per query, και απ ότι έχω καταλάβει per query plan. Και εκεί ο Server αποφασίζει άν υπάρχει λόγος να εκτελεστεί αλλιώς τότε θα εκτελεστεί σειριακά, αλλίως το default είναι παράλληλη εκτέλεση.  

# Οκτωβρίου 27, 2007 1:27 μμ
Ποιά είναι η άποψή σας για την παραπάνω δημοσίευση;

(απαιτούμενο)

(απαιτούμενο)

(προαιρετικό)

(απαιτούμενο)
ÅéóÜãåôå ôïí êùäéêü:
CAPTCHA Image

Ενημέρωση για Σχόλια

Αν θα θέλατε να λαμβάνετε ένα e-mail όταν γίνονται ανανεώσεις στο περιεχόμενο αυτής της δημοσίευσης, παρακαλούμε γίνετε συνδρομητής εδώ

Παραμείνετε ενήμεροι στα τελευταία σχόλια με την χρήση του αγαπημένου σας RSS Aggregator και συνδρομή στη Τροφοδοσία RSS με σχόλια