目录

写在前面

文档与系列文章

事务

增删改查

总结

写在前面

上篇文章介绍了nhibernate的增删改查方法及增加修改操作,这篇文章将介绍nhibernate的事务操作。

SQL Server中的事务

在sql中使用begin transaction开启一个事务, rollback transaction用于回滚事务, commit transaction用于提交所有的事务处理结果,即确认事务的处理。事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功,若其中有一个语句执行失败,则整个处理就算失败,并恢复到处理前的状态。

begin transaction开启一个事务,以成功提交或者失败回滚结束。

通过上面的描述,我们得到这样一个消息,事务处理中的操作要么都成功,要么都回滚。上篇文章中我们遗留了一个问题:普通的增删改查,如果成功则提交,如果失败了,则回滚。和事务是有区别的,比如一个循环中的,插入操作,如果成功了则提交,如果有坏数据,但并不影响已经提交的数据,而事务不同,数据是一个稻草上的蚂蚱,你发达了都发达,你阴沟里翻船了就会都翻船。

文档与系列文章

[Nhibernate]体系结构

[NHibernate]ISessionFactory配置

[NHibernate]持久化类(Persistent Classes)

[NHibernate]O/R Mapping基础

[NHibernate]集合类(Collections)映射 

[NHibernate]关联映射

[NHibernate]Parent/Child

[NHibernate]缓存(NHibernate.Caches)

[NHibernate]NHibernate.Tool.hbm2net

[NHibernate]Nullables

[NHibernate]Nhibernate如何映射sqlserver中image字段

[NHibernate]基本配置与测试 

[NHibernate]HQL查询 

[NHibernate]条件查询Criteria Query

[NHibernate]增删改操作

事务

增删改查

nhibernate中的事务也是通过ISession来创建,在实际项目中应用的代码如下:

增加或者修改客户对象

         /// <summary>
/// 通过事务的方式添加或者修改
/// </summary>
/// <param name="customer">添加的对象</param>
/// <returns>是否成功</returns>
public bool SaveOrUpdateByTrans(Customer customer)
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
var session = nhibernateHelper.GetSession();
using (ITransaction transaction = session.BeginTransaction())
{
try
{
session.SaveOrUpdate(customer);
session.Flush();
//成功则提交
transaction.Commit();
return true;
}
catch (Exception)
{
//出现异常,则回滚
transaction.Rollback();
throw;
}
}
}

那么我在这里再问一下,什么时候用事务?

个人觉得,任何时候都需要用,增删改查都需要用,因为你不知道程序啥时候发神经病。通过事务的处理的特性要么都成功,要么就都回滚。特别是在银行系统中,你敢不用吗?如果发现错误了,还扣你的钱,你愿意?还有在程序中,在一对多关系处理的时候,这些地方也应该注意,涉及到主外键关系,要么都成功删除,要么就回滚,别出现那种删除了一部分,留一部分的情况,那些数据很恶心(之前就帮客户处理过几千条的错误数据,真心恶心死了)。

测试

         /// <summary>
/// 添加客户信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnAdd_Click(object sender, EventArgs e)
{
Guid guidCustomerID = Guid.NewGuid();
var customer = new Customer() { CustomerName = "zhangsan3322", CustomerAddress = "北京 海淀", CustomerID = guidCustomerID };
Business.CustomerBusiness customerBusiness = new Business.CustomerBusiness();
//使用事务的方式添加客户信息
if (customerBusiness.SaveOrUpdateByTrans(customer))
{
RepeaterDataBind();
}
//提供一个名字长度溢出的测试数据
customer = new Customer() { CustomerName = "我爱北京天安门,我爱北京,我爱万里长城", CustomerAddress = "上海", CustomerID = Guid.NewGuid()};
//使用事务的方式添加客户信息
if (customerBusiness.SaveOrUpdateByTrans(customer))
{
RepeaterDataBind();
}
}

在添加第二条信息的时候会出现如下异常

结果

可见第二条出现数据并没有提交数据库。

生成的sql

通过生成的sql语句,应该会发现,能真正提交上来的仍然会生成一个存储过程。通过ISession创建的事务对象,是存在内存中的,只将成功的提交给sql server,而失败的就回滚,不会提交。

总结

关于事务的地方就学习到这里,鉴于增删改事务处理代码基本类似,也就不再一一列出,感兴趣的可以自己动手试一试。希望本文对你有所帮助。

参考文章:http://www.cnblogs.com/lyj/archive/2008/10/20/1315032.html

[NHibernate]事务的更多相关文章

  1. NHibernate系列文章十四:NHibernate事务

    摘要 NHibernate实现事务机制非常简单,调用ISession.BeginTransaction()开启一个事务对象ITransaction,使用ITransaction.Commit()提交事 ...

  2. 01-06-01【Nhibernate (版本3.3.1.4000) 出入江湖】事务

    Nhibernate事务的使用: public void Add(Customer customer) { ISession session = _sessionManager.GetSession( ...

  3. 耗时两月,NHibernate系列出炉

    写在前面 这篇总结本来是昨天要写的,可昨天大学班长来视察工作,多喝了点,回来就倒头就睡了,也就把这篇总结的文章拖到了今天. nhibernate系列从开始着手写,到现在前后耗费大概两个月的时间,通过总 ...

  4. [NHibernate]并发控制

    目录 写在前面 文档与系列文章 并发控制 乐观并发控制(Optimistic Concurrency) 一个例子 悲观并发控制(Pessimistic Concurrency) 总结 写在前面 上篇文 ...

  5. [NHibernate]组件之依赖对象

    目录 写在前面 文档与系列文章 组件之依赖对象 一个例子 总结 写在前面 周一至周四一直在成都出差,也一直没有更新博客了,一回到家第一件事就是扒一扒最近博客园更新的文章,然后把想看的收藏了,大概有20 ...

  6. [NHibernate]一对多关系(级联删除,级联添加)

    目录 写在前面 文档与系列文章 一对多关系 一个例子 级联删除 级联保存 总结 写在前面 在前面的文章中,我们只使用了一个Customer类进行举例,而在客户.订单.产品中它们的关系,咱们并没有涉及, ...

  7. [NHibernate]一对多关系(关联查询)

    目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关 ...

  8. [NHibernate]多对多关系(关联查询)

    目录 写在前面 文档与系列文章 多对多关系关联查询 总结 写在前面 上篇文章介绍了nhibernate中对一对多关系进行关联查询的几种方式,以及在使用过程需要注意的问题.这篇文章对多对多关系的查询处理 ...

  9. [NHibernate]延迟加载

    目录 写在前面 文档与系列文章 延迟加载 一个例子 总结 写在前面 上篇文章介绍了多对多关系的关联查询的sql,HQL,Criteria查询的三种方式.本篇文章将介绍nhibernate中的延迟加载方 ...

随机推荐

  1. RPM包制作教程

    一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...

  2. Postgresql 取随机数

    取0和1之间的随机数 SELECT RANDOM(); 取介于两数之间的随机数 SELECT random()*(b-a)+a; ); 取介于两数之间的随机整数 SELECT floor(random ...

  3. ASP.NET Core AD 域登录

    在选择AD登录时,其实可以直接选择 Windows 授权,不过因为有些网站需要的是LDAP获取信息进行授权,而非直接依赖Web Server自带的Windows 授权功能. 当然如果使用的是Azure ...

  4. NYOJ 478

    月老的烦恼(1) 描述 月老最近遇到了一个很棘手的问题,就是“剩男”“剩女”急速增长,而自己这边又人手不足导致天天都得加班.现在需要你来帮助月老解决这个问题,牵红绳的规则很简单:每个男生都一个编号n( ...

  5. jquery的回调对象Callbacks详解

    Callbacks : 对函数的统一管理 Callbacks的options参数接受4个属性,分别是once : 只执行一次momery : 记忆stopOnFalse : 强制退出循环unique ...

  6. ThinkPHP跨控制器调用方法

    跨控制器调用方法 1. 先造对象,再调用里面的方法 $sc=new \Home\Controller\IndexController();  用绝对路径找echo $sc->ShuChu(); ...

  7. SecureCRT连接虚拟机(ubuntu)配置

    使用SecureCRT连接虚拟机(ubuntu)配置记录   这种配置方法,可以非常方便的操作虚拟机里的Linux系统,且让VMware在后台运行,因为有时候我直接在虚拟机里操作会稍微卡顿,或者切换速 ...

  8. gradle项目中资源文件的相对路径打包处理技巧

    开发java application时,不管是用ant/maven/gradle中的哪种方式来构建,通常最后都会打包成一个可执行的jar包程序,而程序运行所需的一些资源文件(配置文件),比如jdbc. ...

  9. 写Java也得了解CPU--伪共享

    第一次接触伪共享的概念,是在马丁的博客上:而ifeve也把这一系列博文翻译整理好了.概读了几次,感觉到此概念的重要.因此有了这个系列的第二篇读后总结. 1. 什么是伪共享(False sharing) ...

  10. 使用CocoaPods开发并打包静态库

    Cocoapods作为OS X和iOS开发平台的类库管理工具,已经非常完善和强大.通常我们用pod来管理第三方开源类库,但我们也极有可能会开发一个用pod管理依赖关系的静态类库给其他人使用,而又不愿意 ...