Add full Markdown documentation set
This commit is contained in:
65
docs/transactions-and-disposal.md
Normal file
65
docs/transactions-and-disposal.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# Transactions and Disposal
|
||||
|
||||
DynamORM manages connections, command pools, and transaction stacks internally.
|
||||
|
||||
## Connection and Transaction Options
|
||||
|
||||
`DynamicDatabaseOptions` controls behavior:
|
||||
|
||||
- `SingleConnection`
|
||||
- `SingleTransaction`
|
||||
- `SupportSchema`
|
||||
- `SupportStoredProcedures`
|
||||
- `SupportNoLock`
|
||||
- `SupportTop` / `SupportLimitOffset` / `SupportFirstSkip`
|
||||
|
||||
Typical setup:
|
||||
|
||||
```csharp
|
||||
var options =
|
||||
DynamicDatabaseOptions.SingleConnection |
|
||||
DynamicDatabaseOptions.SingleTransaction |
|
||||
DynamicDatabaseOptions.SupportLimitOffset |
|
||||
DynamicDatabaseOptions.SupportSchema;
|
||||
```
|
||||
|
||||
## Transaction Usage
|
||||
|
||||
```csharp
|
||||
using (var db = new DynamicDatabase(factory, connectionString, options))
|
||||
using (var conn = db.Open())
|
||||
using (var tx = conn.BeginTransaction())
|
||||
using (var cmd = conn.CreateCommand())
|
||||
{
|
||||
cmd.SetCommand("UPDATE users SET first = 'Ada' WHERE id = 1").ExecuteNonQuery();
|
||||
tx.Commit();
|
||||
}
|
||||
```
|
||||
|
||||
Global transaction mode is also available via `db.BeginTransaction()`.
|
||||
|
||||
## Disposal Guarantees
|
||||
|
||||
Current disposal behavior includes idempotent guards on key objects:
|
||||
|
||||
- `DynamicDatabase`
|
||||
- `DynamicConnection`
|
||||
- `DynamicCommand`
|
||||
- `DynamicTransaction`
|
||||
- `DynamicTable`
|
||||
- builder and parser helpers
|
||||
|
||||
This prevents repeated cleanup from throwing or re-disposing lower-level resources.
|
||||
|
||||
## Pooling and Rollback Behavior
|
||||
|
||||
Behavior validated by `DynamORM.Tests/Helpers/PoolingTests.cs`:
|
||||
|
||||
- Disposing the database invalidates active commands.
|
||||
- Open transactions are rolled back during disposal when not committed.
|
||||
|
||||
## Practices
|
||||
|
||||
- Prefer `using` blocks for `DynamicDatabase`, connections, commands, transactions, and builders.
|
||||
- Do not manually re-dispose the same object from multiple ownership paths unless `IsDisposed` is checked.
|
||||
- Keep transaction scope short and explicit.
|
||||
Reference in New Issue
Block a user