En MongoDB, una operación en un solo documento es atómica. Debido a que puede utilizar matrices y documentos incrustados para capturar relaciones entre datos en una estructura de documento único en lugar de normalizar en varios documentos y colecciones, esta atomicidad de documento único evita la necesidad de transacciones de documentos múltiples para muchos casos prácticos de uso.
Para situaciones que requieren atomicidad de lecturas y escrituras en múltiples documentos (en una o varias colecciones), MongoDB admite transacciones de múltiples documentos. Con transacciones distribuidas, las transacciones se pueden utilizar en múltiples operaciones, colecciones, bases de datos, documentos y fragmentos.
➤ Utilice el menú desplegable Seleccione su idioma en la parte superior derecha para configurar el idioma del siguiente ejemplo.
Este ejemplo destaca los componentes clave de la API de transacciones.
El ejemplo utiliza la nueva API de devolución de llamada para trabajar con transacciones, que inicia una transacción, ejecuta las operaciones especificadas y confirma (o aborta en caso de error). La nueva API de devolución de llamada también incorpora lógica de reintento para TransientTransactionError
o UnknownTransactionCommitResult
cometer errores.IMPORTANTE
- Recomendadas . Utilice el controlador de MongoDB actualizado para la versión de su implementación de MongoDB. Para transacciones en implementaciones de MongoDB 4.2 (conjuntos de réplicas y clústeres fragmentados), los clientes deben usar controladores MongoDB actualizados para MongoDB 4.2.
- Al utilizar los controladores, cada operación de la transacción debe estar asociada con la sesión (es decir, pasar la sesión a cada operación).
- Las operaciones en el uso de transacciones de lectura preocupación a nivel de transacción , la preocupación de escritura a nivel de transacción , y el nivel de transacción leen preferencia .
- En MongoDB 4.2 y versiones anteriores, no puede crear colecciones en transacciones. Las operaciones de escritura que dan como resultado inserciones de documentos (por ejemplo,
insert
operaciones de actualización conupsert: true
) deben estar en colecciones existentes si se ejecutan dentro de transacciones. - A partir de MongoDB 4.4, puede crear colecciones en transacciones de forma implícita o explícita. Sin embargo, debe utilizar los controladores MongoDB actualizados a la versión 4.4. Consulte Crear colecciones e índices en una transacción para obtener más detalles.
static bool
with_transaction_example (bson_error_t *error)
{
mongoc_client_t *client = NULL;
mongoc_write_concern_t *wc = NULL;
mongoc_read_concern_t *rc = NULL;
mongoc_read_prefs_t *rp = NULL;
mongoc_collection_t *coll = NULL;
bool success = false;
bool ret = false;
bson_t *doc = NULL;
bson_t *insert_opts = NULL;
mongoc_client_session_t *session = NULL;
mongoc_transaction_opt_t *txn_opts = NULL;
/* For a replica set, include the replica set name and a seedlist of the
* members in the URI string; e.g.
* uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \
* "27017/?replicaSet=myRepl";
* client = mongoc_client_new (uri_repl);
* For a sharded cluster, connect to the mongos instances; e.g.
* uri_sharded =
* "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/";
* client = mongoc_client_new (uri_sharded);
*/
client = get_client ();
/* Prereq: Create collections. */
wc = mongoc_write_concern_new ();
mongoc_write_concern_set_wmajority (wc, 1000);
insert_opts = bson_new ();
mongoc_write_concern_append (wc, insert_opts);
coll = mongoc_client_get_collection (client, "mydb1", "foo");
doc = BCON_NEW ("abc", BCON_INT32 (0));
ret = mongoc_collection_insert_one (
coll, doc, insert_opts, NULL /* reply */, error);
if (!ret) {
goto fail;
}
bson_destroy (doc);
mongoc_collection_destroy (coll);
coll = mongoc_client_get_collection (client, "mydb2", "bar");
doc = BCON_NEW ("xyz", BCON_INT32 (0));
ret = mongoc_collection_insert_one (
coll, doc, insert_opts, NULL /* reply */, error);
if (!ret) {
goto fail;
}
/* Step 1: Start a client session. */
session = mongoc_client_start_session (client, NULL /* opts */, error);
if (!session) {
goto fail;
}
/* Step 2: Optional. Define options to use for the transaction. */
txn_opts = mongoc_transaction_opts_new ();
rp = mongoc_read_prefs_new (MONGOC_READ_PRIMARY);
rc = mongoc_read_concern_new ();
mongoc_read_concern_set_level (rc, MONGOC_READ_CONCERN_LEVEL_LOCAL);
mongoc_transaction_opts_set_read_prefs (txn_opts, rp);
mongoc_transaction_opts_set_read_concern (txn_opts, rc);
mongoc_transaction_opts_set_write_concern (txn_opts, wc);
/* Step 3: Use mongoc_client_session_with_transaction to start a transaction,
* execute the callback, and commit (or abort on error). */
ret = mongoc_client_session_with_transaction (
session, callback, txn_opts, NULL /* ctx */, NULL /* reply */, error);
if (!ret) {
goto fail;
}
success = true;
fail:
bson_destroy (doc);
mongoc_collection_destroy (coll);
bson_destroy (insert_opts);
mongoc_read_concern_destroy (rc);
mongoc_read_prefs_destroy (rp);
mongoc_write_concern_destroy (wc);
mongoc_transaction_opts_destroy (txn_opts);
mongoc_client_session_destroy (session);
mongoc_client_destroy (client);
return success;
}
/* Define the callback that specifies the sequence of operations to perform
* inside the transactions. */
static bool
callback (mongoc_client_session_t *session,
void *ctx,
bson_t **reply,
bson_error_t *error)
{
mongoc_client_t *client = NULL;
mongoc_collection_t *coll = NULL;
bson_t *doc = NULL;
bool success = false;
bool ret = false;
client = mongoc_client_session_get_client (session);
coll = mongoc_client_get_collection (client, "mydb1", "foo");
doc = BCON_NEW ("abc", BCON_INT32 (1));
ret =
mongoc_collection_insert_one (coll, doc, NULL /* opts */, *reply, error);
if (!ret) {
goto fail;
}
bson_destroy (doc);
mongoc_collection_destroy (coll);
coll = mongoc_client_get_collection (client, "mydb2", "bar");
doc = BCON_NEW ("xyz", BCON_INT32 (999));
ret =
mongoc_collection_insert_one (coll, doc, NULL /* opts */, *reply, error);
if (!ret) {
goto fail;
}
success = true;
fail:
mongoc_collection_destroy (coll);
bson_destroy (doc);
return success;
}
CONSEJO:
Para ver un ejemplo en mongo
shell, consulte mongo
Ejemplo de shell .
NOTA
Transacciones distribuidas y transacciones de varios documentos
A partir de MongoDB 4.2, los dos términos son sinónimos. Las transacciones distribuidas se refieren a transacciones de varios documentos en grupos fragmentados y conjuntos de réplicas. Las transacciones de múltiples documentos (ya sea en clústeres fragmentados o conjuntos de réplicas) también se conocen como transacciones distribuidas a partir de MongoDB 4.2.
Para situaciones que requieren atomicidad de lecturas y escrituras en múltiples documentos (en una o varias colecciones), MongoDB admite transacciones de múltiples documentos:
-
En la versión 4.0 , MongoDB admite transacciones de múltiples documentos en conjuntos de réplicas.
-
En la versión 4.2 , MongoDB introduce transacciones distribuidas, que agrega soporte para transacciones de múltiples documentos en clústeres fragmentados e incorpora el soporte existente para transacciones de múltiples documentos en conjuntos de réplicas.
Para usar transacciones en implementaciones de MongoDB 4.2 (conjuntos de réplicas y clústeres fragmentados), los clientes deben usar controladores de MongoDB actualizados para MongoDB 4.2.
Las transacciones de múltiples documentos son atómicas (es decir, proporcionan una propuesta de "todo o nada"):
-
Cuando se confirma una transacción, todos los cambios de datos realizados en la transacción se guardan y son visibles fuera de la transacción. Es decir, una transacción no confirmará algunos de sus cambios mientras revierte otros.
Hasta que se confirma una transacción, los cambios de datos realizados en la transacción no son visibles fuera de la transacción.
Sin embargo, cuando una transacción escribe en varios fragmentos, no todas las operaciones de lectura externas deben esperar a que el resultado de la transacción confirmada sea visible en los fragmentos. Por ejemplo, si se confirma una transacción y la escritura 1 es visible en el fragmento A pero la escritura 2 aún no es visible en el fragmento B, una lectura externa en caso de lectura
"local"
puede leer los resultados de la escritura 1 sin ver la escritura 2. -
Cuando una transacción se anula, todos los cambios de datos realizados en la transacción se descartan sin que se hagan visibles. Por ejemplo, si falla alguna operación en la transacción, la transacción se cancela y todos los cambios de datos realizados en la transacción se descartan sin que nunca sean visibles.
IMPORTANTE
En la mayoría de los casos, la transacción de múltiples documentos genera un mayor costo de rendimiento que la escritura de un solo documento, y la disponibilidad de transacciones de múltiples documentos no debe reemplazar el diseño de esquemas efectivo. Para muchos escenarios, el modelo de datos desnormalizados (documentos y matrices incrustados) seguirá siendo óptimo para sus datos y casos de uso. Es decir, para muchos escenarios, modelar sus datos de manera adecuada minimizará la necesidad de transacciones de múltiples documentos.
Para consideraciones adicionales sobre el uso de transacciones (como el límite de tiempo de ejecución y el límite de tamaño del registro de operaciones), consulte también Consideraciones de producción .
CONSEJO:
__Lecturas externas durante la confirmación__
Las transacciones distribuidas se pueden usar en múltiples operaciones, colecciones, bases de datos, documentos y, a partir de MongoDB 4.2, fragmentos.
Para transacciones:
- Puede especificar operaciones de lectura / escritura (CRUD) en colecciones existentes . Para obtener una lista de operaciones CRUD, consulte Operaciones CRUD .
- Cuando usa la versión de compatibilidad de funciones (fcv)
"4.4"
o superior, puede crear colecciones e índices en las transacciones. Para obtener más información, consulte Crear colecciones e índices en una transacción. - Las colecciones utilizadas en una transacción pueden estar en diferentes bases de datos.
NOTA
No puede crear nuevas colecciones en transacciones de escritura entre particiones. Por ejemplo, si escribe en una colección existente en un fragmento e implícitamente crea una colección en un fragmento diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.
- No puede escribir en colecciones limitadas . (A partir de MongoDB 4.2)
- No se puede leer / escribir en colecciones en las
config
,admin
olocal
bases de datos. - No puede escribir en
system.*
colecciones. - No puede devolver el plan de consulta de la operación admitida (es decir
explain
). - Para los cursores creados fuera de una transacción, no puede llamar
getMore
dentro de la transacción. - Para los cursores creados en una transacción, no puede llamar
getMore
fuera de la transacción. - A partir de MongoDB 4.2, no puede especificar
killCursors
como primera operación en una transacción .
Para obtener una lista de operaciones no admitidas en transacciones, consulte Operaciones restringidas .
CONSEJO:
Al crear o eliminar una colección inmediatamente antes de iniciar una transacción, si se accede a la colección dentro de la transacción, emita la operación de creación o eliminación con preocupación de escritura "majority"
para garantizar que la transacción pueda adquirir los bloqueos necesarios.
CONSEJO:
__Referencia de transacciones y operaciones__
A partir de MongoDB 4.4 con la versión de compatibilidad de funciones (fcv) "4.4"
, puede crear colecciones e índices dentro de una transacción de varios documentos, a menos que la transacción sea una transacción de escritura entre fragmentos. Con "4.2"
o menos, las operaciones que afectan el catálogo de la base de datos, como crear o eliminar una colección o un índice, no se permiten en las transacciones.
Al crear una colección dentro de una transacción:
- Puede crear implícitamente una colección , como con:
- una operación de inserción contra una colección no existente, o
- una operación update / findAndModify con
upsert: true
contra una colección no existente.
- Puede crear explícitamente una colección utilizando el
create
comando o su ayudantedb.createCollection()
.
Al crear un índice dentro de una transacción [ 1 ] , el índice a crear debe estar en:
- una colección inexistente. La colección se crea como parte de la operación.
- una nueva colección vacía creada anteriormente en la misma transacción.
[ 1 ] | También puede ejecutar db.collection.createIndex() y db.collection.createIndexes() en índices existentes para verificar su existencia. Estas operaciones se devuelven correctamente sin crear el índice. |
---|
Restricciones
-
No puede crear nuevas colecciones en transacciones de escritura entre particiones. Por ejemplo, si escribe en una colección existente en un fragmento e implícitamente crea una colección en un fragmento diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.
-
Para la creación explícita de una colección o un índice dentro de una transacción, el nivel de preocupación de lectura de la transacción debe ser
"local"
. La creación explícita se realiza a través de:Mando Método create
db.createCollection()
createIndexes
db.collection.createIndex()
db.collection.createIndexes()
-
El parámetro
shouldMultiDocTxnCreateCollectionAndIndexes
debe sertrue
(el predeterminado). Cuando establezca el parámetro para un clúster fragmentado, establezca el parámetro en todos los fragmentos.
CONSEJO:
Para realizar una operación de recuento dentro de una transacción, use la $count
etapa de agregación o la etapa de agregación $group
(con una $sum
expresión).
Los controladores MongoDB compatibles con las características 4.0 proporcionan una API de nivel de colección countDocuments(filter, options)
como método auxiliar que usa la expresión $group
con una $sum
para realizar un recuento. Los controladores 4.0 han desaprobado la count()
API.
A partir de MongoDB 4.0.3, el mongo
shell proporciona el db.collection.countDocuments()
método auxiliar que usa $group
con una $sum
expresión para realizar un recuento.
Para realizar una operación distinta dentro de una transacción:
-
Para las colecciones no fragmentadas, puede usar el
db.collection.distinct()
método / eldistinct
comando, así como la canalización de agregación con el$group
escenario. -
Para las colecciones fragmentadas, no puede utilizar el
db.collection.distinct()
método ni eldistinct
comando.Para encontrar los valores distintos para una colección fragmentada, use la canalización de agregación con el
$group
escenario en su lugar. Por ejemplo:- En lugar de
db.coll.distinct("x")
, usa:
- En lugar de
db.coll.aggregate([
{ $group: { _id: null, distinctValues: { $addToSet: "$x" } } },
{ $project: { _id: 0 } }
])
-
En lugar de
db.coll.distinct("x", { status: "A" })
, use:db.coll.aggregate([ { $match: { status: "A" } }, { $group: { _id: null, distinctValues: { $addToSet: "$x" } } }, { $project: { _id: 0 } } ])
La canalización devuelve un cursor a un documento:
{ "distinctValues" : [ 2, 3, 1 ] }
Itere el cursor para acceder al documento de resultados.
Comandos informativos, tales como hello
, buildInfo
, connectionStatus
(y sus métodos de ayuda) se permiten en las transacciones; sin embargo, no pueden ser la primera operación de la transacción.
Modificado en la versión 4.4 .
Las siguientes operaciones no están permitidas en transacciones:
- Operaciones que afectan el catálogo de la base de datos, como crear o eliminar una colección o un índice cuando se usa la versión de compatibilidad de funciones (fcv)
"4.2"
o una versión anterior . Con fcv"4.4"
o superior, puede crear colecciones e índices en transacciones a menos que la transacción sea una transacción de escritura entre fragmentos. Para obtener más información, consulte Crear colecciones e índices en una transacción . - Creación de nuevas colecciones en transacciones de escritura entre fragmentos. Por ejemplo, si escribe en una colección existente en un fragmento e implícitamente crea una colección en un fragmento diferente, MongoDB no puede realizar ambas operaciones en la misma transacción.
- Creación explícita de colecciones , por ejemplo,
db.createCollection()
método e índices, por ejemplo,db.collection.createIndexes()
ydb.collection.createIndex()
métodos, cuando se utiliza un nivel de preocupación de lectura diferente a"local"
. - Las
listCollections
y loslistIndexes
comandos y sus métodos de ayuda. - Otras operaciones no CRUD y no informativos, como
createUser
,getParameter
,count
, etc, y sus ayudantes.
CONSEJO
Ver también:
- Las transacciones están asociadas con una sesión; es decir, inicia una transacción para una sesión.
- En cualquier momento, puede tener como máximo una transacción abierta para una sesión.
- Al utilizar los controladores, cada operación de la transacción debe estar asociada con la sesión. Consulte la documentación específica de su controlador para obtener más detalles.
- Si una sesión finaliza y tiene una transacción abierta, la transacción se cancela.
Las operaciones en una transacción utilizan la preferencia de lectura a nivel de transacción .
Con los controladores, puede establecer la preferencia de lectura a nivel de transacción al inicio de la transacción:
- Si la preferencia de lectura a nivel de transacción no está establecida, la transacción utiliza la preferencia de lectura a nivel de sesión.
- Si la preferencia de lectura a nivel de transacción y a nivel de sesión no está establecida, la transacción utiliza la preferencia de lectura a nivel de cliente. De forma predeterminada, la preferencia de lectura a nivel de cliente es
primary
.
Las transacciones de varios documentos que contienen operaciones de lectura deben utilizar la preferencia de lectura primary
. Todas las operaciones en una transacción determinada deben enrutarse al mismo miembro.
Las operaciones en una transacción utilizan la preocupación de lectura a nivel de transacción . Es decir, cualquier preocupación de lectura establecida en el nivel de la colección y la base de datos se ignora dentro de la transacción.
Puede establecer la preocupación de lectura a nivel de transacción al inicio de la transacción.
- Si la preocupación de lectura a nivel de transacción no está configurada, la preocupación de lectura a nivel de transacción toma como valor predeterminado la preocupación de lectura a nivel de sesión.
- Si la preocupación de lectura a nivel de transacción y de sesión no está configurada, la preocupación de lectura a nivel de transacción se establece de forma predeterminada en la preocupación de lectura a nivel de cliente. De forma predeterminada, la preocupación de lectura a nivel de cliente es
"local"
para las lecturas del primario. Ver también:
Las transacciones admiten los siguientes niveles de preocupación de lectura:
"local"
- La preocupación de lectura
"local"
devuelve los datos más recientes disponibles del nodo, pero se puede revertir. - Para transacciones en clústeres fragmentados, la
"local"
preocupación por la lectura no puede garantizar que los datos provengan de la misma vista de instantánea en todos los fragmentos. Si se requiere el aislamiento de instantáneas, utilice la"snapshot"
preocupación de lectura. - A partir de MongoDB 4.4, con la versión de compatibilidad de funciones (fcv)
"4.4"
o superior, puede crear colecciones e índices dentro de una transacción. Si crea explícitamente una colección o un índice, la transacción debe utilizar la preocupación de lectura"local"
. La creación implícita de una colección puede utilizar cualquiera de las preocupaciones de lectura disponibles para las transacciones.
"majority"
- El problema de lectura
"majority"
devuelve datos que han sido reconocidos por la mayoría de los miembros del conjunto de réplicas (es decir, los datos no se pueden deshacer) si la transacción se confirma con el problema de escritura "mayoría" . - Si la transacción no usa la preocupación de escritura "mayoría" para la confirmación, la
"majority"
preocupación de lectura no proporciona garantías de que las operaciones de lectura lean los datos confirmados por mayoría. - Para transacciones en clústeres fragmentados, la
"majority"
preocupación por la lectura no puede garantizar que los datos provengan de la misma vista de instantánea en todos los fragmentos. Si se requiere el aislamiento de instantáneas, utilice la"snapshot"
preocupación de lectura.
"snapshot"
- La preocupación de lectura
"snapshot"
devuelve datos de una instantánea de los datos comprometidos mayoritarios si la transacción se confirma con la preocupación de escritura "mayoría" . - Si la transacción no usa "mayoría" de preocupación de escritura para la confirmación, la
"snapshot"
preocupación de lectura no proporciona ninguna garantía de que las operaciones de lectura usen una instantánea de los datos confirmados por mayoría. - Para transacciones en clústeres fragmentados, la
"snapshot"
vista de los datos se sincroniza entre fragmentos.
Las transacciones utilizan la preocupación de escritura a nivel de transacción para confirmar las operaciones de escritura. Las operaciones de escritura dentro de las transacciones deben emitirse sin una especificación explícita de preocupación de escritura y deben utilizar la preocupación de escritura predeterminada. En el momento de la confirmación, las escrituras se confirman utilizando la preocupación de escritura a nivel de transacción.
CONSEJO
No establezca explícitamente la preocupación de escritura para las operaciones de escritura individuales dentro de una transacción. Establecer preocupaciones de escritura para las operaciones de escritura individuales dentro de una transacción da como resultado un error.
Puede establecer la preocupación de escritura a nivel de transacción al inicio de la transacción:
- Si la preocupación de escritura a nivel de transacción no está configurada, la preocupación de escritura a nivel de transacción toma como valor predeterminado la preocupación de escritura a nivel de sesión para la confirmación.
- Si la preocupación de escritura a nivel de transacción y la preocupación de escritura a nivel de sesión no están configuradas, la preocupación de escritura a nivel de transacción se establece por defecto en la preocupación de escritura a nivel de cliente. De forma predeterminada, la preocupación de escritura a nivel de cliente es
w: 1
. Consulte también Preocupaciones de lectura / escritura de MongoDB predeterminadas .
Las transacciones admiten todos los valores de w de preocupación de escritura , que incluyen:
w: 1
- Escribir
w: 1
reconocimiento devuelve inquietud después de que la confirmación se haya aplicado al primario.
IMPORTANTE
Cuando se compromete con w: 1
, su transacción se puede revertir si hay una conmutación por error .
- Cuando se compromete con
w: 1
preocupación de escritura, la preocupación de"majority"
lectura a nivel de transacción no proporciona garantías de que las operaciones de lectura en la transacción lean datos confirmados por mayoría. - Cuando se compromete con
w: 1
preocupación de escritura, la preocupación de"snapshot"
lectura a nivel de transacción no proporciona ninguna garantía de que las operaciones de lectura en la transacción usen una instantánea de los datos comprometidos por mayoría.
w: "majority"
- Escribir
w: "majority"
reconocimiento de declaraciones de inquietud después de que el compromiso se haya aplicado a una mayoría (M) de miembros votantes; es decir, el compromiso se ha aplicado a las primarias y a las secundarias de votación (M-1). - Cuando se compromete con
w: "majority"
preocupación de escritura, la preocupación de"majority"
lectura a nivel de transacción garantiza que las operaciones hayan leído datos confirmados por mayoría. Para transacciones en clústeres fragmentados, esta vista de los datos comprometidos por la mayoría no se sincroniza entre fragmentos. - Cuando se compromete con
w: "majority"
preocupación de escritura, la preocupación de"snapshot"
lectura a nivel de transacción garantiza que las operaciones tengan una instantánea sincronizada de datos comprometidos por mayoría.
NOTA
Independientemente del problema de escritura especificado para la transacción , la operación de confirmación para una transacción de clúster fragmentado incluye algunas partes que utilizan el {w: "majority", j: true}
problema de escritura.
Para conocer varias consideraciones de producción con el uso de transacciones, consulte Consideraciones de producción . Además, o clústeres fragmentados, consulte también Consideraciones de producción (clústeres fragmentados) .
Las transacciones cuyas operaciones de escritura abarcan varios fragmentos generarán errores y se cancelarán si alguna operación de transacción lee o escribe en un fragmento que contiene un árbitro.
Consulte también Mayoría de preocupación de lectura deshabilitada para conocer las restricciones de transacción en fragmentos que tienen la mayoría de preocupación de lectura deshabilitada.
Un conjunto de réplicas de PSA (árbitro principal-secundario-árbitro) de 3 miembros o un clúster fragmentado con fragmentos de PSA de 3 miembros puede haber deshabilitado la mayoría de interés de lectura ( --enableMajorityReadConcern false
o replication.enableMajorityReadConcern: false
)
En clústeres fragmentados,
- Si una transacción involucra un fragmento que ha inhabilitado la preocupación de lectura "mayoría" , no puede utilizar la preocupación de lectura
"snapshot"
para la transacción. Solo puede usar la preocupación de lectura"local"
o"majority"
para la transacción. Si usa la preocupación de lectura"snapshot"
, la transacción se produce un error y se cancela. -
readConcern level 'snapshot' is not supported in sharded clusters when enableMajorityReadConcern=false.
- Las transacciones cuyas operaciones de escritura abarcan varios fragmentos generarán errores y se abortarán si alguna de las operaciones de lectura o escritura de la transacción involucra un fragmento que ha deshabilitado el problema de lectura
"majority"
.
En el juego de réplicas,
Puede especificar la preocupación de lectura "local"
o "majority"
, o "snapshot"
incluso en el conjunto de réplicas tiene desactivado lectura preocupación "mayoría" .
Sin embargo, si planea realizar la transición a un clúster fragmentado con fragmentos mayoritarios de preocupación de lectura deshabilitados, es posible que desee evitar el uso de la preocupación de lectura "snapshot"
.
CONSEJO
Para comprobar si la preocupación de lectura "mayoría" está deshabilitada, puede ejecutar db.serverStatus()
las mongod
instancias y marcar el storageEngine.supportsCommittedReads
campo. Si false
, lea la preocupación "mayoría" está deshabilitada.
Para obtener más información, ver 3-Miembro Primario-Secundario-Árbitro Arquitectura y tres miembros Primario-Secundario-árbitro Fragmentos .
No puede ejecutar transacciones en un clúster fragmentado que tiene un fragmento con writeConcernMajorityJournalDefault
establecido en false
(como un fragmento con un miembro votante que usa el motor de almacenamiento en memoria ).
NOTA
Independientemente del problema de escritura especificado para la transacción , la operación de confirmación para una transacción de clúster fragmentado incluye algunas partes que utilizan el {w: "majority", j: true}
problema de escritura.
MongoDB proporciona varias métricas de transacciones:
Fuente | Devoluciones |
---|---|
db.serverStatus() método
serverStatus
mando |
Devuelve métricas de transacciones . |
$currentOp canalización
de agregación |
Devoluciones:
|
db.currentOp() método
currentOp
mando |
Devoluciones:
|
mongod y
mongos
registrar mensajes |
Incluye información sobre transacciones lentas (es decir, transacciones
que superan el operationProfiling.slowOpThresholdMs umbral)
en el TXN componente
de registro. |
Para usar transacciones, featureCompatibilityVersion para todos los miembros de la implementación debe ser al menos:
Despliegue | Mínimo featureCompatibilityVersion |
---|---|
Conjunto de réplicas | 4.0 |
Clúster fragmentado | 4.2 |
Para verificar el fCV de un miembro, conéctese al miembro y ejecute el siguiente comando:
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
Para obtener más información, consulte la setFeatureCompatibilityVersion
página de referencia.
A partir de MongoDB 4.2, las transacciones de varios documentos se admiten en conjuntos de réplicas y clústeres fragmentados donde:
- el primario usa el motor de almacenamiento WiredTiger, y
- los miembros secundarios utilizan el motor de almacenamiento WiredTiger o los motores de almacenamiento en memoria .
En MongoDB 4.0, solo los conjuntos de réplicas que utilizan el motor de almacenamiento WiredTiger admitían transacciones.
NOTA
No puede ejecutar transacciones en un clúster fragmentado que tiene un fragmento con writeConcernMajorityJournalDefault
establecido en false
, como un fragmento con un miembro votante que usa el motor de almacenamiento en memoria .
- API de controladores
- Consideraciones de producción
- Consideraciones de producción (clústeres fragmentados)
- Transacciones y operaciones
- Para obtener más información sobre cuándo usar transacciones y si son compatibles con su caso de uso, consulte ¿Son las transacciones adecuadas para usted? presentación de MongoDB.live 2020 .