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}");
}