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

 

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

COM + 1.5 Distributed transaction problem (Sybase)

Îåêßíçóå áðü ôï ìÝëïò axaros. Τελευταία δημοσίευση από το μέλος axaros στις 28-06-2005, 11:58. Υπάρχουν 25 απαντήσεις.
Σελίδα 1 από 2 (26 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-05-2005, 08:36 2030

    COM + 1.5 Distributed transaction problem (Sybase)

    Γεια χαρά σε όλους !!!!!
    Είμαι νέο μέλος και ζητάω τα φώτα σας στο εξής θέμα :

    Έγραψα ένα transactional (library) component με χρήση των Enterprise services του .ΝΕΤ που κάθεται στον COM+ ενός μηχανήματος με XP sp2 για να ολοκληρώσω ένα distributed transaction (Update σε μία βάση Χ, Insert σε μία άλλη Y). H μία βάση (Y) βρίσκεται στο ίδιο μηχάνημα που γίνεται η κλήση (direct call) του component ενώ η άλλη (Χ) κάθεται και αυτή σε μηχάνημα XP sp2.

    Εάν και από τις δυό μεριές χρησιμοποιήσω το SQL server (MSDE) όλα πάνε πρίμα :
    Τα commit και τα rollback δουλεύουν μια χαρά.

    Εάν όμως από τη μιά μεριά (Χ) έχω SQL server και από την άλλη (Υ) Sybase (adaptive server anywhere demo version 9.0.0.1118) για κάποιο λόγο το transaction της Sybase δεν γίνεται enlist και χωρίς να παίρνω κάποιο exeption τρέχει αυτόνομα ...

    Προσπάθησα να συνδεθώ στη Sybase και με τον διαθέσιμο .ΝΕΤ provider iAnywhere.Data.AsaClient.dll και με OLEDB αλλά με τα ίδια αποτελέσματα.

    Καμοιά ιδέα γιατί έχω πραγματικά κολλήσει???



    Πάνος Αβραμίδης
  •  18-05-2005, 15:50 2050 σε απάντηση της 2030

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Χωρίς να θεωρώ εαυτόν ειδικό (και μάλλον λιγότερο γνώστης από εσένα πιθανόν να είμαι), να ρωτήσω πώς γίνεται το distributed transaction? Μιλας για rollbacks. Γινεται λοιπον στο context του ado.net ή στο serviced component (setabort/setcomplete)?

    Χρήσιμο θα είναι πάντως να ακούσουμε μια πιθανή αιτία. Διαβαζα κοιτώντας απο εδω και απο εκεί οτι το SP2 δημιουργεί διάφορα θέματα με τα distributed transactions (γενικα θέματα security με το DTC). Δεν βρήκα όμως κάπου να αναφέρεται "σιωπηλό" non-enlisting operation.


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  18-05-2005, 16:04 2052 σε απάντηση της 2050

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Στο serviced component με Autocomplete on.
    Για να κάνω test το κατέβασα για λίγο ώστε 'χεράτα' να κόψω επιλεκτικά το πρώτο ή το δεύτερο statement.
    Εννοείται ότι έριξα τα firewalls (και από τις δυό μεριές) γιατί αλλιώς ακόμη θα έψαχνα (από ότι βλέπω στα forums)...

    Το ωραίο μάλιστα είναι ότι εάν κάνω single transaction στη Sybase και πάλι δεν έχω πρόβλημα : όλα πάνε μιά χαρά ....

    Exception πάντως δεν παίρνω ...



    Πάνος Αβραμίδης
  •  18-05-2005, 16:18 2053 σε απάντηση της 2052

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Χαζή και εμπειρική ερώτηση:
    Αν αναποδογυρίσεις (αν μπορείς φυσικά) την σειρά με την οποία γίνονται οι ενέργειες, έχεις το ίδιο αποτέλεσμα;

    Αφού με βρίσεις Smile με την ησυχία σου Smile, δες αν μπορείς να μου απαντήσεις και σε άλλη μια ερώτηση (πολλαπλή):

    Το class από το οποίο ξεκινάει η κλήση στις ενέργειες έχει attribute transactionoption.requiresnew ή transactionoption.required για το transaction?
    Η κλήση γίνεται σε άλλο class που έχει transactionoption.supported για κάθε περίπτωση;

    (Αν μου πεις οτι ξεκινάς τις κλήσεις από non-com+ πράγμα και κάνεις δύο διαδοχικές, πράγμα που δεν φαντάζομαι, είναι φυσικό να μην γίνονται enlist στο ίδιο transaction).

    Και τέλος, πως έκανες τη δοκιμή για να δεις αν το transaction ολοκληρώνεται και γίνεται αυτόνομα; Πως δηλαδή είδες οτι δεν γίνεται rollback η πρώτη ενέργεια ενώ η δεύτερη μπορεί να μην έχει πετύχει;



    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  18-05-2005, 17:26 2054 σε απάντηση της 2053

    Δεν είναι καθόλου χαζή η ερώτηση ...

    Δε το δοκίμασα (να γυρίσω τις ενέργειες). Θα το δοκιμάσω ...

    Τα delcarations :

    Transaction(TransactionOption.Required), _

    Synchronization(SynchronizationOption.Required), _

    ObjectPooling(True, 10, 50), _

    JustInTimeActivation(True), _

    EventTrackingEnabled(True)> _

    Public Class Mid

    Inherits ServicedComponent

    Implements IMid


    Δεν γίνεται κλήση σε άλλο class καθόλου.


    Πάνος Αβραμίδης
  •  21-05-2005, 18:18 2130 σε απάντηση της 2030

    COM + 1.5 Distributed transaction problem (Sybase)

    Αυτό που θέλω να κάνω είναι σε ένα βήμα να 
       1)Διαβάσω ένα set εγγραφών
       2)Να το μαρκάρω σαν exported
       3)Nα το εισάγω σε μία Export βάση


    Παρατήρησε ότι 'κόβω' το transaction στο τέλος (ContextUtil.SetAbort() Wink και
    Το Update στον SQL server γίνεται Rollback ενώ το Insert στη Sybase
    'επιτυνγχάνει' ...

    O ίδιος ακριβώς κώδικας με SQL server και στις δύο μεριές δουλεύει μια χαρά
    (γίνονται κανονικά το Rollback )

    Ιδού :

    Τα connection strings :

    SQL Server
    <
    add key="MasterConnectionString" value="Server=192.168.1.102,1433;Network Library=DBMSSOCN;Initial Catalog=SINP MASTER DB;User ID=sa;Password=;Min Pool Size=5;Max Pool Size=60;Connect Timeout=30;" />

    Sybase Asa server (demo)
    <
    add key="ExportServerConnectionString" value="DatabaseName=TEST;UID=DBA;PWD=SQL" />

     

    <Description("Exports data from SQL Server database to the Export Sybase database"), _
    AutoComplete(
    False)> _

    Public Sub ExportFuelPriceChangesToSybase(ByVal SQLServerConnectionString As String, ByVal ExportServerConnectionString As String) _
    Implements IMid.ExportFuelPriceChangesToSybase

    Dim SQL_Server_Connection As New SqlConnection(SQLServerConnectionString)
    Dim Export_Sybase_Server_Connection As New iAnywhere.Data.AsaClient.AsaConnection(ExportServerConnectionString)

    Dim MyAdapter As New SqlDataAdapter
    Dim MyDataset As New DataSet
    Dim MyCommmand As New SqlCommand
    Dim MarkCommand As New SqlCommand
    Dim ExportCommand As New iAnywhere.Data.AsaClient.AsaCommand

    Dim Counter As Integer
    Dim TotalRows As Integer

    Try

    SQL_Server_Connection.Open()
    Export_Sybase_Server_Connection.Open()

    With MyCommmand
       .Connection = SQL_Server_Connection
       .CommandType = CommandType.StoredProcedure
       .CommandText = "spSelectPricechanges"
    End With

    With MarkCommand
       .Connection = SINP_SQL_Server_Connection
       .CommandType = CommandType.StoredProcedure
       .CommandText = "spMarkExportedPriceChanges"
    End With

    With ExportCommand
       .Connection = Export_Sybase_Server_Connection
       .CommandType = CommandType.StoredProcedure
       .CommandText = "spInsertPriceChange"
    End With

    With MyAdapter
       .SelectCommand = MyCommmand
       .Fill(MyDataset, "PriceChanges")
    End With

    TotalRows = MyDataset.Tables(0).Rows.Count - 1

    If Not TotalRows = 0 Then
       Dim ExportedWhen As DateTime = Now
       
    For Counter = 0 To TotalRows
          
    With MarkCommand
             '********** Pass parameters **********
             .ExecuteNonQuery()
          End With

       With ExportCommand
          '********** Pass parameters **********
          .ExecuteNonQuery()
       End With

    Next

    End If

    ContextUtil.SetAbort()

    Catch Ex As Exception

    ContextUtil.SetAbort()

    Finally

    MyCommmand.Dispose()

    MarkCommand.Dispose()

    ExportCommand.Dispose()

    MyAdapter.Dispose()

    MyDataset.Dispose()

    With SQL_Server_Connection
       .Close()
       .Dispose()
    End With

    With Export_Sybase_Server_Connection
       .Close()
       .Dispose()
    End With

    End Try

    End Sub


     


    Πάνος Αβραμίδης
  •  26-05-2005, 12:24 2225 σε απάντηση της 2053

    Re: COM + 1.5 Distributed transaction problem (Sybase)

     cap wrote:

    Αν αναποδογυρίσεις (αν μπορείς φυσικά) την σειρά με την οποία γίνονται οι ενέργειες, έχεις το ίδιο αποτέλεσμα;


    Το έκανα και πάλι δεν .....
    Πάνος Αβραμίδης
  •  26-05-2005, 18:41 2236 σε απάντηση της 2225

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Εκείνο που είχαμε πει, να μην κάνεις και τα 2 connection από την ίδια ρουτίνα, αλλά να κάνεις μια control ρουτίνα και να καλεί μία μία ρουτίνες που να το κάνουν το execute μέσα σε κάθε βάση, το δοκίμασες;

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  26-05-2005, 18:51 2238 σε απάντηση της 2236

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Όχι δάσκαλε γιατί δεν ξέρω πως ακριβώς δουλεύει το Transaction voting ...
    Τα δύο ξεχωριστά function πρέπει να τρέξουν σε Supports (transactions) mode
    σωστά?


    Πάνος Αβραμίδης
  •  26-05-2005, 19:02 2239 σε απάντηση της 2238

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Ναι σωστά. Σκοπός είναι να αναγκάσεις το thread να περάσει από ένα transaction την φορά.

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  06-06-2005, 11:54 2484 σε απάντηση της 2239

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Δάσκαλε επανέρχομαι γιατί τώρα το ξαναέπιασα :

    Επειδή τα steps είναι τρία όπως προανέφερα Read, Update , Insert ...
    Φτιάχνω μία ξεχωριστή μέθοδο το Read σε RequiresNew mode και τις άλλες δύο σε Supported. Ελέγχω καταρχήν ότι έχω το ίδιο Context (με το ID) και πως θα κάνω voting ?

    ContextUtil.EnableCommit()?



     


    Πάνος Αβραμίδης
  •  06-06-2005, 23:56 2527 σε απάντηση της 2484

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Τσου! Όχι .EnableCommit.

    Καταρχήν από ότι θυμάμαι, πρέπει να έχουμε ένα root component και δύο child components που θέλουμε να περάσουμε το νήμα-transaction του root μέσα από αυτά.

    Θα φτιαχτούν τρία classes για να κάνουν την δουλειά αυτή - σε class μπορείς να πεις να είναι requires new/requires και όχι σε method. Το πρώτο μπορεί να είναι αυτό που ξεκινάει το transaction και να κάνει τα reads από την βάση και να καλεί τα άλλα δύο για να κάνουν τα updates/inserts.

    Οι methods που θα καλούνται μπορεί να είναι AutoComplete ή όχι. Αν είναι AutoComplete θα θεωρήται .SetCommit αν δεν γίνει λάθος στην μέθοδο - στην αντίθετη περίπτωση γίνεται .SetAbort. Όταν και οι δύο child γίνουν .SetComplete και το root γίνει .SetComplete, τότε και μόνο τότε θα γίνουν όλα commit.

    Το ίδιο θα γίνει και όταν είσαι σε manual. Θα κάνεις .SetComplete τα δύο child και μετά το root και θα ολοκληρωθεί το transaction.

    Μπορείς να δεις και το σχετικό topic στο MSDN Library - Voting in an Automatic Transaction.

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  07-06-2005, 01:42 2529 σε απάντηση της 2527

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Να το πούμε πιό απλά (να δω αν κι εγώ το σκέφτομαι σωστά - δεν εχω τεράστια εμπειρία σε com+):

    Αν έχεις δύο components που κλήσεις σε αυτά θέλεις να συμμετέχουν στο ίδιο transaction τότε θα πρέπει μέσω ενός τρίτου component να πραγματοποιείς τις κλήσεις. Ας το ονομάσουμε "Πατρικό component".

    Αυτό θα πρέπει να έχει ένα από τα εξής:

    TransactionOption.RequiresNew
    (αν είναι αυτό που θα ξεκινήσει την transaction)

    ή

    TransactionOption.Required
    (αν δεν είμαστε σίγουροι αν ξεκινάει αυτό ή κάποιο άλλο component που έχει ξεκινήσει transaction το καλεί - και ΘΕΛΟΥΜΕ να συμμετέχει στη συγκεκριμένη transaction) 

    ή

    TransactionOption.Supported
    (αν είμαστε σίγουροι οτι κάποιος άλλος ξεκινά το transaction - σε αυτή την περίπτωση βεβαια ισως και να μην μας χρειάζεται το επιπλέον component, αφού έχουμε ήδη άλλον που κάνει τη δουλειά).

    Ας πούμε λοιπόν οτι για το "πατρικό" χρησιμοποιούμε RequiresNew ή Required.

    Τα "απο κάτω", δηλ. τα δύο components που θέλουμε να συμμετέχουν στο transaction καλούνται από το "πατρικό" (γίνονται δηλ. κλήσεις σε methods τους). Εδώ ισχύουν γενικά τα εξής: Το "πατρικό" έχει γνώση μόνο του αν κάτι πήγε στραβά ή δεν πήγε. Αν κάτι πήγε στραβά, γνέφει αντίο στο transaction και το κάνει abort. Αν όλα πάνε καλά, κάνει complete το transaction.

    Σημείωση: Δεν έχουμε πάει ακόμα στα "απο κατω". Για να γίνουν οι κλήσεις και να πετύχουν, έχουμε δύο τρόπους:

    1. Να έχουμε ενεργό το Autocomplete attribute στο "πατρικό" component (στη μέθοδο που καλούμε και με τη σειρά της καλεί τα διάφορα των "απο κάτω"). Εδώ ένα exception που θα έρθει από τα "απο κάτω" αρκεί για να τελειώσει άδοξα η ζωή του transaction και να γίνει αυτό abort.

    2. Να κάνουμε με το χεράκι ContextUtil.SetComplete (και contextUtil.SetAbort φυσικά αν κάτι πάει στραβά). Εδώ έχουμε περισσότερο έλεγχο. Παλι πρέπει να πιάσουμε exceptions, πάλι πρέπει να κάνουμε ελέγχους. Απλά μπορούμε (δυνητικά) να αγνοήσουμε π.χ. ένα συγκεκριμένο exception και να σφυρίξουμε αδιάφορα κάνοντας setComplete.


    Τωρα πάμε στα "απο κάτω":

    Τα "απο κάτω" πρέπει οπωσδήποτε να έχουν TransactionOption.Supported. Αυτό γιατί ξέρουμε οτι ΔΕΝ πρόκειται να ξεκινήσουν μόνα τους αυτόνομα transactions αλλά θα συμμετέχουν στο context ενός transaction που θα ξεκινήσει από το "πατρικό". (Θα μπορούσε να γίνει πιό περίπλοκο και να έχουν Required, αλλα ας το αφήσουμε για τώρα - πιστεύω οτι μετά πρέπει να φτιάξουμε διαγράμματα).

    Τι μας λέει αυτό:
    Με RequiresNew στο πατρικό και Supported στα απο κάτω, η κλήση του πατρικού ξεκινάει ένα νέο transaction και "μπάζει" στο παιχνίδι και τα απο κάτω components, τα οποία συμμετέχουν σε αυτό.

    Τωρα για το αν θα έχουν autocomplete οι μέθοδοι που καλούνται στα "απο κάτω":
    Αν έχουν, ολα καλά. Με το που θα γίνει μια στραβή σε οποιοδήποτε από τα δύο, τρώει χυλόπιτα και το "πατρικό", μια και γίνεται αυτόματα setAbort το transaction του "απο κάτω" που έπαθε τη στραβή. Αρα, το "πατρικό" δεν μπορεί να ολοκληρώσει.

    Αν δεν έχουν, πάλι όλα καλά. Χειριζόμαστε εμείς την κατάσταση και κάνουμε με το χεράκι το setAbort μας σε περίπτωση σφάλματος. Ετσι, πάλι το "πατρικό" τρώει τη χυλόπιτα και δίνει διαζύγιο στο transaction.

    Η μόνη περίπτωση να μην παίξει το όλο "πάντρεμα" είναι πιστεύω το να βάλει κανείς TransactionOption.RequiresNew στα "απο κάτω". Ετσι γράφουν στα παλιά τους τα παπούτσια το transaction του "πατρικού" και ξεκινούν δικό τους.

    Γιώργο, διόρθωσέ με σε όποιο σημείο δεν τα λέω καλά.




    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  07-06-2005, 09:03 2533 σε απάντηση της 2529

    Re: COM + 1.5 Distributed transaction problem (Sybase)

    Παιδιά πραγματικά σας ευχαριστώ ...
    Μια άλλη ερώτηση :
    Στην περίπτωση μου αφού Read και το Update step αφορούν την μία εκ των δύο βάσεων χρειάζομαι όντως ξεχωριστό class και method?

    To Insert στη Sybase είναι ξεκάθαρο ότι θα υλοποιηθεί σε ξεχωριστό class με TransactionOption.Supported...


    Πάνος Αβραμίδης
  •  08-06-2005, 00:03 2563 σε απάντηση της 2533

    Re: COM + 1.5 Distributed transaction problem (Sybase)

     axaros wrote:

    Παιδιά πραγματικά σας ευχαριστώ ...
    Μια άλλη ερώτηση :
    Στην περίπτωση μου αφού Read και το Update step αφορούν την μία εκ των δύο βάσεων χρειάζομαι όντως ξεχωριστό class και method?

    To Insert στη Sybase είναι ξεκάθαρο ότι θα υλοποιηθεί σε ξεχωριστό class με TransactionOption.Supported...



    Όχι, αλλά σίγουρα χρειάζεσαι διαφορετικά methods.

    George J.

    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Σελίδα 1 από 2 (26 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems