NHibernate 中的事务(Transactions)
什么时候使用事务?
在任何时候都要使用事务,即使是在读取、查询数据的时候,为什么呢?
因为你不清楚数据库什么时候操作失败,如何恢复原来数据。而 NHibernate 中的事务(可以通过tx.Rollback()方法), 帮助我们完成这些事情
事务的基本用法
ITransaction tx = session.BeginTransaction();
//一些保存、更新、删除等操作
tx.Commit();
实际上在 NHibernate 使用事务要使用 using 强制资源清理和异常机制,一般像这样:
在using中使用
using (ITransaction tx = _session.BeginTransaction())
{
try
{
//一些保存、更新、删除等操作
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
事务中新增
public int CreateNewsTransaction(News news)
{
using (ITransaction tx = session.BeginTransaction())
{
try
{
int newId = (int)session.Save(news);
session.Flush();
tx.Commit();
return newId;
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
Code language: PHP (php)
var newNews = new News() { AddTime = DateTime.Now, Content = "大家好哈哈啊啊啊", Status = false, Title = "顶顶顶我是新增的" };
newsDal.CreateNewsTransaction(newNews);
Code language: JavaScript (javascript)
事务中删除和更新对象
在事务内删除对象
public void DeleteCustomerTransaction(News news)
{
using (ITransaction tx = session.BeginTransaction())
{
try
{
session.Delete(news);
session.Flush();
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
Code language: JavaScript (javascript)
var news = newsDal.GetByID(6);
newsDal.DeleteNewsTransaction(news);
事务中更新数据
public void UpdateCustomerTransaction(News news)
{
using (ITransaction tx = session.BeginTransaction())
{
try
{
session.Update(news);
session.Flush();
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
Code language: JavaScript (javascript)
事务中更新和新增数据
public void SaveOrUpdateCustomersTransaction(IList<News> newses)
{
using (ITransaction tx = session.BeginTransaction())
{
try
{
foreach (News c in newses)
session.SaveOrUpdate(c);
session.Flush();
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback(); throw;
}
}
}
Code language: PHP (php)
NHibernate 中的并发控制
什么是并发控制?
当许多人试图同时修改数据库中的数据时,必须实现一个控制系统,使一个人所做的修改不
会对他人所做的修改产生负面影响。这称为并发控制。
简单的理解就是 2 个或多个用者同时编辑相同的数据。这里的用者可能是:实际用户、不
同服务、不同的代码段(使用多线程), 及其在断开式和连接式情况下可能发生的情况。
并发控制理论根据建立并发控制的方法而分为两类:
一对多关系
比如我们的news表和newskeys表是一堆多的关系,然后我们的keys表和newskeys也是一对多的关系。这样,我们就可以说news和keys是多对多的关系。
不过为了讲解这个对应关系。我们使用顾客和订单的关系。一个顾客可能又多条订单。