ich beschäftige mich seit etwa einem Jahr mit der Programmierung, vor allem mit der Sprache Python und hätte hier eine Frage, die ich hier gerne stellen möchte.
Es geht um folgendes, ich arbeite an einem Programm, bei dem es vorkommen kann, dass gleichzeitige Zugriffe auf eine MYSQL Datenbank stattfinden. Wie könnte man verhindern, dass es zu Fehlern oder Inkonsistenzen bei den Daten kommt, falls der Fall eines gleichzeitigen Zugriffs erfolgt?
Ich hatte mir etwas überlegt, mein Ansatz wäre eine Warteschlange, die ich in etwa so gebaut hätte, siehe Code. Es würde mich freuen, wenn ihr mir sagen könntet, ob man das so machen könnte, ob das thread safe ist und ob es bessere Möglichkeiten gäbe? Danke im Voraus...
Code: Alles auswählen
import queue
import threading
import mysql.connector
# Verbindung zur MySQL-Datenbank herstellen
db = mysql.connector.connect(
host="192.168.102.17",
user="root",
password="...",
database="test"
)
#print(db)
# Lock erstellen
lock = threading.Lock()
# Queue erstellen
q = queue.Queue()
# Funktion zum Ausführen von MySQL-Abfragen
def run_query(query):
cursor = db.cursor()
cursor.execute(query)
result = cursor.fetchall()
cursor.close()
return result
# Funktion zum Ausführen der Warteschlange
def process_queue():
while True:
# MySQL-Abfrage aus der Warteschlange abrufen
query = q.get()
# Lock acquiren
lock.acquire()
# MySQL-Abfrage ausführen
print(run_query(query))
# Lock releasen
lock.release()
# Abgeschlossene Abfrage aus der Warteschlange entfernen
q.task_done()
# Beispiel-Abfragen zur Warteschlange hinzufügen
#q.put("INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2')")
q.put("SELECT * FROM tab_test")
# Threads erstellen und starten
for i in range(4):
t = threading.Thread(target=process_queue)
t.daemon = True
t.start()
# Warten, bis die Warteschlange abgeschlossen ist
q.join()
# Verbindung zur MySQL-Datenbank schließen
db.close()