4.4.3 Session
在Ibatis DataMapper中,会话就是ADO connetction和transaction的容器。
DataMapper中的IDalSession实现了
IDisposable可以使用using语法糖
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using ( IDalSession session = sqlMap.OpenConnection() ) { Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; }
Seesion不能嵌套使用。
一个线程,一个SqlMapper
对象最多开启一个会话。即一个线程中一个SqlMapper对象嵌套使用mapper.OpenConnection()会抛出异常(IBatisNet.DataMapper.Exceptions.DataMapperException:“SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first.”)
一个线程中,一个SqlMapper对象可以嵌套另一个SqlMapper对象打开会话
4.4.4. Connection
The DataMapper API includes methods to demarcate connection boundaries.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// Open a session : Open an ADO connection public void OpenConnection() // Close a session : Close the associated ADO connection public void CloseConnection()
Connection example
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
sqlMap.OpenConnection() Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; sqlMap.CloseConnection() // Same thing with using instruction using ( IDalSession session = sqlMap.OpenConnection() ) { Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; }
4.4.5. Automatic Session
Example Using automatic session
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Item item = (Item) sqlMap.executeQueryForObject ("GetItem", itemId); item.Description = "test"; // No session demarcated, so open/close connection will be automatic (implied) sqlMap.Update("UpdateItem", item); item.Description = newDescription; item.Description = "test2"; // No transaction demarcated, so open/close connection will be automatic (implied) sqlMap.Update("UpdateItem", item);
4.4.6. Transaction
transaction methods
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// Begin a transactional session : Open a connection and begin an ADO transaction public void BeginTransaction() // Begin a transactional session : Open a connection is specified and begin an ADO transaction public void BeginTransaction(bool openConnection) // Begin a transactional session : Open a connection and begin an ADO transaction // with the specified IsolationLevel public void BeginTransaction(IsolationLevel isolationLevel) // Begin a transactional session : Open a connection is specified and begin an ADO transaction // with the specified IsolationLevel public void BeginTransaction(bool openConnection, IsolationLevel isolationLevel) // Commit a session : Commit the ADO transaction and close the connection public void CommitTransaction() // Commit a session : Commit the ADO transaction and close the connection if specified public void CommitTransaction(bool closeConnection) // RollBack a session : RollBack the ADO transaction and close the connection public void RollBackTransaction() // RollBack a session : RollBack the ADO transaction and close the connection if specified public void RollBackTransaction(bool closeConnection)
Example Using transactions
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
try { sqlMap.BeginTransaction(); Item item = (Item) sqlMap.QueryForObject("getItem", itemId); item.Description = newDescription; sqlMap.Update("updateItem", item); sqlMap.CommitTransaction(); } catch { sqlMap.RollBackTransaction(); } // With "using" syntax using ( IDalSession session = sqlMap.BeginTransaction() ) { Item item = (Item) sqlMap.QueryForObject("getItem", itemId); item.Description = newDescription; sqlMap.Update("updateItem", item); session.Complete(); // Commit }
4.4.7. Distributed Transactions
分布式事务可以跨越多个资源管理器(如SQL Server 和Oracle)的事务,并协调他们之间的事务
Example Using distributed transactions
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using IBatisNet.Common.Transaction; using (TransactionScope tx = new TransactionScope()) { sqlMapSqlServer.OpenConnection(); // Transaction will be automatically associated account = sqlMapSqlServer.QueryForObject("GetAccount", accountId) as Account; account.FirstName = "Gilles"; sqlMapSqlServer.Update(account); sqlMapSqlServer.CloseConnection(); sqlMapOracle.OpenConnection(); // Transaction will be automatically associated product = sqlMapOracle.QueryForObject("GetProduct", productId) as Product; product.Quantity = 1000; sqlMapOracle.Update(product); sqlMapOracle.CloseConnection(); tx.Complete(); // Commit }
This TransactionScope
class does not support a nested transaction scope with different transaction options.???????????