4.4.3 Session

Ibatis DataMapper中,会话就是ADO connetctiontransaction的容器。

DataMapper中的IDalSession实现了IDisposable可以使用using语法糖

using ( IDalSession session = sqlMap.OpenConnection() )
{
  Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account;
}
View Code

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.

// Open a session : Open an ADO connection
public void OpenConnection() 
// Close a session : Close the associated ADO connection
public void CloseConnection()
View Code

Connection example

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;
}
View Code

4.4.5. Automatic Session

Example Using automatic session

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);
View Code

4.4.6. Transaction

transaction methods

// 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)
View Code

Example Using transactions

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
}
View Code

4.4.7. Distributed Transactions

分布式事务可以跨越多个资源管理器(如SQL Server 和Oracle)的事务,并协调他们之间的事务

Example Using distributed transactions

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
}
View Code

 

This TransactionScope class does not support a nested transaction scope with different transaction options.???????????

 

posted @ 2020-03-29 23:25  vvf  阅读(181)  评论(0编辑  收藏  举报