NHibernate 中的事务

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是多对多的关系。

不过为了讲解这个对应关系。我们使用顾客和订单的关系。一个顾客可能又多条订单。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注