Sobes.tech
Junior

Τι είναι μια συναλλαγή;

sobes.tech AI

Απάντηση από AI

Μια συναλλαγή στο πλαίσιο του C# και των βάσεων δεδομένων/κατανεμημένων συστημάτων είναι μια ακολουθία ενεργειών που εκτελούνται ως μια αδιαίρετη ενότητα (ατομική μονάδα εργασίας). Ή όλες οι ενέργειες στη συναλλαγή ολοκληρώνονται με επιτυχία (επιβεβαιώνονται), ή καμία δεν εκτελείται (ανατρέπεται).

Οι συναλλαγές διαθέτουν τις ιδιότητες ACID:

  • Ατομικότητα: Όλες οι ενέργειες ολοκληρώνονται με επιτυχία, ή καμία.
  • Συνεκτικότητα: Η συναλλαγή μεταφέρει το σύστημα από μια συνεκτική κατάσταση σε μια άλλη.
  • Απομόνωση: Οι παράλληλες συναλλαγές δεν επηρεάζουν η μία την άλλη.
  • Ανθεκτικότητα: Τα αποτελέσματα μιας επιτυχούς ολοκληρωμένης συναλλαγής διατηρούνται ακόμα και σε περίπτωση σφαλμάτων συστήματος.

Στην C#, για εργασία με συναλλαγές, συχνά χρησιμοποιούνται οι ακόλουθες κλάσεις:

  • System.Data.Common.DbTransaction (βασική κλάση για συναλλαγές βάσεων δεδομένων)
  • System.Transactions.TransactionScope (απλοποιεί τη διαχείριση κατανεμημένων συναλλαγών)
  • Ειδικές κλάσεις συναλλαγών παρόχων ADO.NET (π.χ., System.Data.SqlClient.SqlTransaction)

Παράδειγμα χρήσης του TransactionScope:

// Χρήση του TransactionScope για αυτόματο διαχειρισμό συναλλαγής
using System;
using System.Data.SqlClient;
using System.Transactions;

// Υποθέτουμε ότι υπάρχει μια συμβολοσειρά σύνδεσης
string connectionString = "...";

try
{
    using (var scope = new TransactionScope())
    {
        using (var connection1 = new SqlConnection(connectionString))
        {
            connection1.Open();
            using (var command1 = new SqlCommand("UPDATE Accounts SET Balance = Balance - 100 WHERE AccountId = 1", connection1))
            {
                command1.ExecuteNonQuery();
            }
        }

        using (var connection2 = new SqlConnection(connectionString))
        {
            connection2.Open();
            // Προσομοίωση σφάλματος για επίδειξη ανάκλησης
            // Χρησιμοποιήστε μια πραγματική εντολή UPDATE/INSERT/DELETE
            // using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
            // {
            //     command2.ExecuteNonQuery();
            // }
            throw new InvalidOperationException("Προσομοίωση σφάλματος"); // Προσομοίωση σφάλματος
        }

        // Αν όλες οι ενέργειες ολοκληρωθούν με επιτυχία, καλείται το Complete
        scope.Complete();
        Console.WriteLine("Η συναλλαγή επιβεβαιώθηκε.");
    }
}
catch (Exception ex)
{
    // Αν προκύψει σφάλμα, το TransactionScope ακυρώνει αυτόματα τη συναλλαγή
    Console.WriteLine($"Η συναλλαγή ακυρώθηκε. Σφάλμα: {ex.Message}");
}