#
Transaction
A transaction is a single logical unit of work which accesses and possibly modifies the contents of a database. Transactions access data using read and write operations.
Nitrite supports transactional operations on its collections and repositories. A transaction can be committed or rolled back. Once a transaction is committed, all the changes are persisted to the disk. If a transaction is rolled back, all the changes are discarded.
#
Transaction on NitriteCollection
A transaction can be started from a session using the Session.beginTransaction()
method. To start a transactional operation on a NitriteCollection
, the Transaction.getCollection()
method can be used. All the operations performed on the collection will be part of the transaction.
// start a transaction
var transaction = await session.beginTransaction();
// get a collection
var collection = await transaction.getCollection("test");
// perform operations on the collection
await collection.insert(doc1);
// commit the transaction
await transaction.commit();
Nitrite also provides a Session.executeTransaction()
method to execute a transactional operation. The Session.executeTransaction()
method takes a callback function as an argument. The callback function will be executed inside a transaction.
await session.executeTransaction((transaction) async {
var collection = await transaction.getCollection("test");
await collection.insert(doc1);
});
If any exception occurs inside the transaction, the transaction will be rolled back. If you want to rollback a transaction only for certain exceptions, you can use the Session.executeTransaction()
method with rollbackFor
parameter. The rollbackFor
parameter takes a list of exception types for which the transaction will be rolled back. For any other exceptions, the transaction will be committed.
await session.executeTransaction((transaction) async {
var collection = await transaction.getCollection("test");
await collection.insert(doc1);
}, rollbackFor: [NitriteException]);
Any find operations performed inside a transaction will return all the documents including the uncommitted ones.
Any find operations performed outside a transaction will return only the committed documents.
#
Auto-commit Operations
Certain operations are auto-committed in Nitrite. Those operations are not part of a transaction and cannot be rolled back. The following operations are auto-committed:
NitriteCollection.createIndex()
NitriteCollection.rebuildIndex()
NitriteCollection.dropIndex()
NitriteCollection.dropAllIndices()
NitriteCollection.drop()
NitriteCollection.clear()
NitriteCollection.close()
#
Transaction on ObjectRepository
A transaction can be started from a session using the Session.beginTransaction()
method. To start a transactional operation on a ObjectRepository
, the Transaction.getRepository()
method can be used. All the operations performed on the repository will be part of the transaction.
// start a transaction
var transaction = await session.beginTransaction();
// get a repository
var repository = await transaction.getRepository<Employee>();
// perform operations on the repository
await repository.insert(employee);
// commit the transaction
await transaction.commit();
Nitrite also provides a Session.executeTransaction()
method to execute a transactional operation. The Session.executeTransaction()
method takes a callback function as an argument. The callback function will be executed inside a transaction.
await session.executeTransaction((transaction) async {
var repository = await transaction.getRepository<Employee>();
await repository.insert(employee);
});
If any exception occurs inside the transaction, the transaction will be rolled back. If you want to rollback a transaction only for certain exceptions, you can use the Session.executeTransaction()
method with rollbackFor
parameter. The rollbackFor
parameter takes a list of exception types for which the transaction will be rolled back. For any other exceptions, the transaction will be committed.
await session.executeTransaction((transaction) async {
var repository = await transaction.getRepository<Employee>();
await repository.insert(employee);
}, rollbackFor: [NitriteException]);
Any find operations performed inside a transaction will return all the entities including the uncommitted ones.
Any find operations performed outside a transaction will return only the committed entities.
#
Auto-commit Operations
Certain operations are auto-committed in Nitrite. Those operations are not part of a transaction and cannot be rolled back. The following operations are auto-committed:
ObjectRepository.createIndex()
ObjectRepository.rebuildIndex()
ObjectRepository.dropIndex()
ObjectRepository.dropAllIndices()
ObjectRepository.drop()
ObjectRepository.clear()
ObjectRepository.close()
#
Session
A session represents a transactional context for a Nitrite database. Session is used to create a new transaction. A session should be closed after use to release any resources held by it. If a session is closed and the transaction is not committed, all opened transactions will be rolled back.
#
Create a Session
A session can be created using the Nitrite.createSession()
method. Multiple sessions can be created for a Nitrite database.
// create a session
var session = db.createSession();
#
Close a Session
A session can be closed using the Session.close()
method. If a session is closed and the transaction is not committed, all opened transactions will be rolled back.
// close a session
await session.close();
#
Checking If Session is Active
A session can be checked if it is active or not using the Session.isActive
getter.
// check if session is active
if (session.isActive) {
// do something
}
#
Managing Transactions
A transaction can be started using the Session.beginTransaction()
method.
// start a transaction
var transaction = await session.beginTransaction();
A transaction can be committed using the Transaction.commit()
method. If a transaction is committed, all the changes are persisted to the disk.
// commit a transaction
await transaction.commit();
A transaction can be rolled back using the Transaction.rollback()
method. If a transaction is rolled back, all the changes are discarded.
// rollback a transaction
await transaction.rollback();
A transaction can be closed using the Transaction.close()
method. If a transaction is closed and the transaction is not committed, all opened transactions will be rolled back.
// close a transaction
await transaction.close();
#
Querying Transaction State
The current state of a transaction can be retrieved using the Transaction.getState()
method. It returns an enum of type TransactionState
.
// get transaction state
var state = transaction.getState();
Possible values for TransactionState
are:
TransactionState.active
- The transaction is active.TransactionState.committed
- The transaction is committed.TransactionState.partiallyCommitted
- The transaction is partially committed.TransactionState.closed
- The transaction is closed.TransactionState.failed
- The transaction is failed.TransactionState.aborted
- The transaction is aborted.