MongoDB-Grundlagen: Transaktionsverarbeitung

Einführung

Transaktionsunterstützung ist seit MongoDB 4.0 verfügbar. Es gibt weitere Anwendungsfälle, da Transaktionen jetzt verarbeitet werden können. image.png

Quelle: https://docs.mongodb.com/manual/core/transactions-in-applications/

Einzelner Knoten wird nicht unterstützt, oder? Wenn Sie es ausführen, tritt ein Fehler auf.

Exception in thread "main" com.mongodb.MongoClientException: Sessions are not supported by the MongoDB cluster to which this client is connected
	at com.mongodb.client.internal.MongoClientImpl.startSession(MongoClientImpl.java:127)
	at com.mongodb.client.internal.MongoClientImpl.startSession(MongoClientImpl.java:113)
	at mongodb.MongoDBTest.main(MongoDBTest.java:24)

Vorbereitung der Replikatsatzumgebung

Wenn Sie keine Replikatsatzumgebung haben, bereiten Sie diese zuerst lokal vor. image.png Quelle: https://docs.mongodb.com/manual/replication/

Erstellen Sie einen Ordner für jeden Knoten

Node1: /data/mongo-replicaset/node1 Node2: /data/mongo-replicaset/node2 Node3: /data/mongo-replicaset/node3

Starten Sie jeden Knoten


mongod --replSet my-set --dbpath /data/mongo-replicaset/node1 --logpath /data/mongo-replicaset/node1/node1.log --port 27001
mongod --replSet my-set --dbpath /data/mongo-replicaset/node2 --logpath /data/mongo-replicaset/node2/node2.log --port 27002
mongod --replSet my-set --dbpath /data/mongo-replicaset/node3 --logpath /data/mongo-replicaset/node3/node3.log --port 27003

Initialisierung des Relica-Sets

Stellen Sie eine Verbindung zu Node1 her und initialisieren Sie.

rs.initiate(
{
        "_id" : "my-set",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "localhost:27001"
                },
                {
                        "_id" : 1,
                        "host" : "localhost:27002"
                },
                {
                        "_id" : 2,
                        "host" : "localhost:27003"
                }
        ]
});

Ausführungsergebnis: image.png

Überprüfen Sie den Status mit rs.status ()

image.png

OK. Sie sind jetzt bereit.

Versuchen Sie die Transaktionsverarbeitung mit JAVA

Fügen Sie verschiedenen DBs mehrere Datensätze hinzu

MongoDBTest.java


package mongodb;

import com.mongodb.ReadConcern;
import com.mongodb.ReadPreference;
import com.mongodb.TransactionOptions;
import com.mongodb.WriteConcern;
import com.mongodb.client.ClientSession;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.TransactionBody;

import java.util.Date;

import org.bson.Document;

public class MongoDBTest {

	public static void main(String[] args) {
		//MongoDB-Client generieren
		MongoClient client = MongoClients.create("mongodb://localhost:27001,localhost:27002,localhost:27003");

		//Wenn die Sammlung nicht vorhanden ist, wird die Transaktion nicht verarbeitet, sodass Code die Sammlung erstellt.
        //(Nur einmal. Sie können die Sammlung manuell hinzufügen.)
		client.getDatabase("front").getCollection("access_log").withWriteConcern(WriteConcern.MAJORITY)
				.insertOne(new Document("dummy", 0));
		client.getDatabase("server").getCollection("users").withWriteConcern(WriteConcern.MAJORITY)
				.insertOne(new Document("dummy", 0));

		//Erstellen Sie eine Sitzung
		ClientSession session = client.startSession();

		//Optionsdefinition
		TransactionOptions txnOptions = TransactionOptions.builder().readPreference(ReadPreference.primary())
				.readConcern(ReadConcern.LOCAL).writeConcern(WriteConcern.MAJORITY).build();

		TransactionBody txnBody = new TransactionBody<String>() {
			public String execute() {
				MongoCollection<Document> frontAccessLog = client.getDatabase("front").getCollection("access_log");
				MongoCollection<Document> serverUsers = client.getDatabase("server").getCollection("users");

				//Zugriffsprotokoll
				Document accessLog = new Document();
				accessLog.append("log", "xxxx");
				accessLog.append("acccessDate", new Date());

				frontAccessLog.insertOne(session, accessLog);

				//Benutzerdaten
				Document user = new Document();
				user.append("lastName", "tanaka");
				user.append("firstName", "tarou");
				user.append("createDate", new Date());

				serverUsers.insertOne(session, user);

				return "OK";
			}
		};

		try {
			//In derselben Transaktion verarbeitet
			session.withTransaction(txnBody, txnOptions);

		} catch (RuntimeException e) {
			//Abnormale Verarbeitung

		} finally {
			session.close();
		}

		//Schließen Sie den Client
		client.close();
	}
}

Ich konnte die Daten problemlos einfügen. image.png

Verarbeitung mehrerer Datensätze in derselben Datenbank

MongoDBTest.java


package mongodb;

import com.mongodb.ReadConcern;
import com.mongodb.ReadPreference;
import com.mongodb.TransactionOptions;
import com.mongodb.WriteConcern;
import com.mongodb.client.ClientSession;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.TransactionBody;
import com.mongodb.client.model.Filters;

import java.util.Date;

import org.bson.Document;

public class MongoDBTest {

	public static void main(String[] args) {
		//MongoDB-Client generieren
		MongoClient client = MongoClients.create("mongodb://localhost:27001,localhost:27002,localhost:27003");

		//Erstellen Sie eine Sitzung
		ClientSession session = client.startSession();

		//Optionsdefinition
		TransactionOptions txnOptions = TransactionOptions.builder().readPreference(ReadPreference.primary())
				.readConcern(ReadConcern.LOCAL).writeConcern(WriteConcern.MAJORITY).build();

		TransactionBody txnBody = new TransactionBody<String>() {
			public String execute() {
				MongoCollection<Document> frontAccessLog = client.getDatabase("front").getCollection("access_log");

				//Dummy-Daten löschen
				frontAccessLog.deleteOne(Filters.eq("dummy", 0));
				
				//Zugriffsprotokoll
				Document accessLog = new Document();
				accessLog.append("log", "yyyyy");
				accessLog.append("acccessDate", new Date());

				frontAccessLog.insertOne(session, accessLog);
				
				//Mach es abnormal
				throw new RuntimeException("Verarbeitung gescheitert.");
                // return "OK";
			}
		};

		try {
			//In derselben Transaktion verarbeitet
			session.withTransaction(txnBody, txnOptions);

		} catch (RuntimeException e) {
			//Abnormale Verarbeitung
			e.printStackTrace();
		} finally {
			session.close();
		}

		//Schließen Sie den Client
		client.close();
	}
}

Da es abnormal ausgelöst wurde, können Sie bestätigen, dass sich die DB-Daten nicht geändert haben. Nach dem Löschen der throw new RuntimeException (" Verarbeitung fehlgeschlagen. "); Konnte ich die Daten wie erwartet löschen und einfügen.

Transaktions-URL: https://docs.mongodb.com/manual/core/transactions/ Replication: https://docs.mongodb.com/manual/replication/ Aufbau von RelicaSet: https://docs.mongodb.com/manual/tutorial/deploy-replica-set/ ReplicaSet-Authentifizierungseinstellungen: https://docs.mongodb.com/manual/tutorial/deploy-replica-set-with-keyfile-access-control/

das ist alles

Recommended Posts

MongoDB-Grundlagen: Transaktionsverarbeitung
Pandas Grundlagen für Anfänger ⑧ Ziffernverarbeitung
Grundlagen zum Berühren von MongoDB mit MongoEngine
Grundlagen der binärisierten Bildverarbeitung durch Python
[Python3 / MongoDB] Fassen Sie Pymongo-Verarbeitungsaufrufe leicht zusammen