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

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

LinQ to SQL with Transactions ( Cookie: PLinq )

Îåêßíçóå áðü ôï ìÝëïò m6s. Τελευταία δημοσίευση από το μέλος m6s στις 30-06-2010, 21:25. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  30-06-2010, 12:03 59316

    LinQ to SQL with Transactions ( Cookie: PLinq )

    Καλημέρα σας...
    εξετάζω το .net 4. Και μια δεν έχω ξαναπιάσει το Linq ever...μου προέκυψε το εξής : "Να φτιάξω μια κλάση που να επικοινωνεί με την βάση και να χρησιμοποιήσω transaction με Linq2sql".
    Θα ήθελα να σας το υποβάλλω στην κρίση σας λοιπόν και να μου πείτε άν κάνω κάποιο λάθος μέχρι εδώ...
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    namespace IBilling.Tests.Controllers {
    	public class SQL {
    		public void selectFromSQL() {
    			IBillingRepository billingRepository = new Models.IBillingRepository();
    			var db = IBilling.Models.IBillingRepository.getDb();
    			db.Log = Console.Out;
    			db.Connection.Open();
    			System.Data.Common.DbTransaction trx = db.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable);
    			db.Transaction = trx;
    			var companies = billingRepository.getCompanyByID("00F1AF44-C882-455E-ADEC-9777F11F409B");
    			Assert.AreEqual(companies.CompanyCode, "01002012  ");
    			companies.CompanyCode = "01002012  ";
    			try {
    				db.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);
    				if (trx != null)
    					trx.Commit();
    				companies = billingRepository.getCompanyByID("00F1AF44-C882-455E-ADEC-9777F11F409B");
    			} catch (Exception ex) {
    				Console.WriteLine(ex.ToString());
    				if (trx != null)
    					trx.Rollback();
    			} finally {
    
    				// Close the connection
    				if (db.Connection.State == System.Data.ConnectionState.Open)
    					db.Connection.Close();
    			}
    			Assert.AreEqual(companies.CompanyCode, "01002012  ");
    		}
    	}

    Αν είναι οκ, το πρόβλημα μου τότε είναι ότι ήθελα να το τεστάρω. Παρατήρησα λοιπόν το εξής:
    1. Αν είχα 2 μεθόδους διαφορετικές με ίδιο body της συνάρτησης η "companies", είχε τις τιμές σε διαφορετικό "scope"! Αυτό δεν το περίμενα. Έχει να κάνει ότι ειναι δυναμική; (var)? Γίνεται;
    2. Αλλαξα στην μια companies και στην άλλη το έκανα companies2. Πάλι μου έβγαζε πρόβλημα το connection. Λογικό;
    3. Σκέφτομαι να κάνω παράλληλη επεξεργασία της ίδιας της συνάρτησης και μου έρχετε PLinq :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    [TestClass]
    	public class TestSQL {
    		[TestMethod]
    		public void run() {
    			IEnumerable<SQL> qries = new SQL[] {new SQL(), new SQL() };
    			Stopwatch watch = new Stopwatch();
    			watch.Start();
    			var data = from eachRun in qries.AsParallel() select new {
    				eachRun, ThreadID = Thread.CurrentThread.ManagedThreadId
    			};
    			try {
    				data.ForAll(i => i.eachRun.selectFromSQL());
    			} catch (AggregateException ex) {
    				Console.WriteLine(ex.InnerException.Message);
    			}
    			watch.Stop();
    			Console.WriteLine(watch.Elapsed.ToString());
    			Console.ReadLine();
    
    		}
    	}

    Και ΑΝ είναι και αυτό σωστά γραμμένο(!), το πρόβλημα είναι ότι δεν μπορώ να καταλάβω ( γιατί δεν έχω βρεί τον τρόπο πώς να ταυτοποιήσω το δεύτερο thread ), σκάει με ένα μήνυμα : "An item with the same key has already been added.".
    Και υποθέτω τώρα, ότι το companies (γιατί εκεί γίνεται) έχει κάνει το select στο πρώτο thread, αλλά...το 2ο thread, έχει ίδιο reference στο αρχικό companies. (Ξαναλέω δεν έχω  καταφέρει να δώ πώς και αν αυτό ισχύει γιατί πραγματικά είναι 2 τα threads. Απλά όταν πατάω F10 το καταλαβαίνω γιατί σε κάθε γραμμή η φωτεινή κίτρινη γραμμή, εκτελείται 2 φορές. )

    Με συγχωρείται για το μεγάλο post...



  •  30-06-2010, 14:55 59319 σε απάντηση της 59316

    Απ: LinQ to SQL with Transactions ( Cookie: PLinq )

    Τα explicit transactions στο Linq2Sql και στο EF χρησιμοποιούνται σε συγκεκριμένες περιπτώσεις μιας και οι μεταβολές στο context όταν αποστέλλονται στη βάση αποθηκεύονται στο πλαίσιο ενός transaction έτσι κι αλλιώς. Στη συγκεκριμένη περίπτωση, η συμπεριφορά που παρατηρείς δεν οφείλεται στο var, αλλά μάλλον στο ότι ανοίγεις και δεύτερο context ή/και connection. Αν θέλεις να δουλέψεις μ' αυτόν τον τρόπο χρησιμοποίησε το transactionscope, που είναι και ο απλούστερος τρόπος για να πετύχεις αυτό που θέλεις όταν έχεις κι άλλο context ανοιχτό.

    Δεν έχω ασχοληθεί με PLINQ, αλλά στο δεύτερο κομμάτι κώδικα προσπαθείς να τρέξεις το ίδιο query δύο φορές και να βάλεις τα αποτελέσματα στο ίδιο context; Πιθανόν γι΄αυτό σου λέει ότι υπάρχουν αντικείμενα με το ίδιο key. Επίσης, δεν είναι υπερβολικό που μπλέκεις PLinq με threading;


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  30-06-2010, 21:23 59325 σε απάντηση της 59319

    Απ: LinQ to SQL with Transactions ( Cookie: PLinq )

    Μάρκο Καλησπέρα,

    Οσον αφορά το transactionscope το είδα είναι ένας εναλλακτικός τρόπος. Αλλά από οτι βλέπω έχω πετύχει το transaction. (Λόγω των τεστ που έκανα, δοκίμασα σε κάποια φάση εξωτερικά να εισάγω μια γραμμή ενώ είχα δώσει το select και ήμουν στο transaction ). Επίσης, όπως έχω δεί στα tutorial δεν πρέπει να χω ξεφύγει.

    Αυτό που λές που όμως για το context/connection με ανησυχεί. Έχω καταλάβει σωστά, ή όχι, ότι το datacontext δεν είναι dataset. Και ανοίγει κάθε φορά που ζητάς με ένα tab σε browser την σελίδα. Δεν έχει να κάνει με το session επίσης. (Εκτός και αν το βάλεις σε κάποια Session Array. Σωστά;
    Αρά αν έχω στο ταβ1 την σελίδα, στο ταβ2 είναι διαφορετικό το datacontext. Λάθος;

    Ξεκινώντας το στο σημείο του PLinq, περιμένω να έχω διαφορετικά context. Διότι καλώ την selectSQL(), ( ΝΟΜΙΖΩ) κάθε φορά από την αρχή με νέο context. ε?

    ( Flame Probability :-)
    Το PLinq, μου φάνηκε τίποτα περισσότερο απο το Linq ( ήδη είναι η δευτερη μέρα που το ασχολιέμαι με το Linq και μου φαίνεται λίγο δύστροπο ).
    Το Plinq όμως νομίζω κάνει αυτό που θέλω εύκολα αρκεί να ξέρεις το συντακτικό.
    Επειδή ήδη μου εχει φανεί σίχαμα ο συνδυασμός Linq2sql με infragistics, είπα να χρησιμοποιείσω το PLinq :-P :-P :-P)


    Master-Detail με Linq παλεύεται;
  •  30-06-2010, 21:25 59326 σε απάντηση της 59325

    Απ: LinQ to SQL with Transactions ( Cookie: PLinq )

    Οπα ξαναβλέπωντας το , καλώ το getDb() αυτό ήταν static ( γιατί δεν ήθελα να ανοίγω νέα context! ), Οπότε αυτό ίσως προκαλεί το πρόβλημα για το αρχικό μήνυμα.
    Θα το δοκιμάσω αυριο γραφείο....
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems