Heim  >  Artikel  >  Datenbank  >  Detaillierte Codebeispiele für Probleme, die bei verschachtelten MySQL-Transaktionen auftreten

Detaillierte Codebeispiele für Probleme, die bei verschachtelten MySQL-Transaktionen auftreten

黄舟
黄舟Original
2017-03-06 13:26:281017Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zu den Problemen vorgestellt, die bei verschachtelten MySQL-Transaktionen auftreten.

MySQL unterstützt verschachtelte Transaktionen, aber nicht viele Leute tun dies. Ich habe einige Ausländer gesehen, die über die Notwendigkeit verschachtelter MySQL-Transaktionen im Ausland diskutierten. Es amüsiert mich zu Tode. Warum ist diese Verwendung von verschachtelten Geistern für die Szene notwendig? Ich habe mit meinen ehemaligen DBA-Kollegen gesprochen und erfahren, dass in keinem Szenario verschachtelte MySQL-Transaktionen verwendet werden sollten.

Auf welche Probleme werden Sie also stoßen, wenn Sie verschachtelte MySQL-Transaktionen verwenden?

mysql> select * from ceshi; 
+------+ 
| n  | 
+------+ 
|  1 | 
+------+ 
1 row in set (0.00 sec) 
 
mysql> start transaction ; 
Query OK, 0 rows affected (0.00 sec) 
 
mysql> insert into ceshi values(2); 
Query OK, 1 row affected (0.00 sec) 
 
mysql> start transaction ; 
Query OK, 0 rows affected (0.00 sec) 
 
mysql> insert into ceshi values(3); 
Query OK, 1 row affected (0.00 sec) 
 
mysql> commit; 
Query OK, 0 rows affected (0.00 sec) 
 
mysql> rollback; 
Query OK, 0 rows affected (0.00 sec)


Obwohl ich am Ende einen Rollback durchgeführt habe, aber die Datenanzeige ist 1 2 3 Ursprünglich dachten alle, dass sich meine Transaktion am Ende so anfühlte, als wäre sie zurückgesetzt worden. Tatsächlich wollen wir sehen, dass die Untertransaktion ausgeführt wird erfolgreich, und der Fehler der äußeren Transaktion wird zurückgegeben. Dies ist jedoch nicht der Fall. Das Endergebnis ist 1 2 3.

+-----+ 
| n   | 
+-----+ 
|  1 | 
|  2 | 
|  3 | 
+-----+

Wenn der SQL-Interpreter auf eine Starttransaktion stößt, erfolgt ein Commit ausgelöst. … !!! Wenn Sie zu diesem Zeitpunkt zum Rollback wechseln, ist es definitiv nutzlos ... Da es bereits übermittelt wurde, was können Sie tun, um ein Rollback durchzuführen ...

Wie bereits erwähnt, In Bezug auf die Architektur gibt es im Allgemeinen nur sehr wenige Leute, die verschachtelte Transaktionen verwenden, aber manchmal werden sie versehentlich verschachtelt. Nehmen wir als Beispiel das Python-Projekt, um die Transaktionspaketierung zu implementieren. Dann werden die Datenverarbeitungsfunktionen def a() und def b() durch Transaktionen umschlossen . Einzeltransaktion. Was passiert, wenn eine Logik b erneut aufruft? Ja, Transaktionen sind verschachtelt ... Ich denke, dass dies ein Problem ist, auf das die meisten Geschäftsentwicklungen stoßen werden.

begin_1  sql_1  begin_2  sql_2  sql_3 commit_1  rollback_1  . Wie kann man dieses Risiko vermeiden? Sie können eine Sperre hinzufügen ... Richten Sie eine globale Sperre ein, und der Sperrstatus wird beurteilt, bevor die Untertransaktion erstellt wird ...

Wenn Sie ein Flask-Framework verwenden, können Sie globale Variablen von Flask G verwenden.

Wenn es sich um ein Django-Framework handelt, können Sie Thread Local verwenden, um globale Variablen zu verwenden.

Wenn es sich um eine asynchrone E/A-Architektur wie Tornado und Gevent handelt, können Sie fd verwenden, um Coroutine-Variablen zuzuordnen.

Wenn wir die folgende Anweisung ausführen, wird die Transaktion zum Commit gezwungen. Die Voraussetzung hier ist natürlich Autocommit = True.

@decorator
def with_transaction(f, *args, **kwargs):
 
  db = connection.get_db_by_table("*")
  try:
    db.begin()
    ret = f(*args, **kwargs)
    db.commit()
  except:
    db.rollback()
    raise
  return ret
 
 
@with_transaction
def hide(self):
  '''订单不在app端显示'''
  if self.status not in OrderStatus.allow_deletion_statuses():
    raise OrderStatusChangeNotAllowed(self.status, OrderStatus.deleted)
...
 
 
@with_transaction
def change_receipt_info(self, address, name, phone):
  region = Region.get_by_address(address)
  ...

Das Obige ist eine detaillierte Erläuterung der Codebeispiele für Probleme, die bei verschachtelten MySQL-Transaktionen auftreten. Weitere verwandte Inhalte finden Sie in PHP Chinesische Website (www.php.cn)!

ALTER FUNCTION  
ALTER PROCEDURE  
ALTER TABLE  
BEGIN  
CREATE DATABASE  
CREATE FUNCTION  
CREATE INDEX  
CREATE PROCEDURE  
CREATE TABLE  
DROP DATABASE  
DROP FUNCTION  
DROP INDEX  
DROP PROCEDURE  
DROP TABLE  
UNLOCK TABLES  
LOAD MASTER DATA  
LOCK TABLES  
RENAME TABLE  
TRUNCATE TABLE  
SET AUTOCOMMIT=1  
START TRANSACTION

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn