[NHibernate]事务

目录

写在前面

文档与系列文章

事务

增删改查

总结

写在前面

上篇文章介绍了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来创建,在实际项目中应用的代码如下:

增加或者修改客户对象

 1         /// <summary>
 2         /// 通过事务的方式添加或者修改
 3         /// </summary>
 4         /// <param name="customer">添加的对象</param>
 5         /// <returns>是否成功</returns>
 6         public bool SaveOrUpdateByTrans(Customer customer)
 7         {
 8             NHibernateHelper nhibernateHelper = new NHibernateHelper();
 9             var session = nhibernateHelper.GetSession();
10             using (ITransaction transaction = session.BeginTransaction())
11             {
12                 try
13                 {
14                     session.SaveOrUpdate(customer);
15                     session.Flush();
16                     //成功则提交
17                     transaction.Commit();
18                     return true;
19                 }
20                 catch (Exception)
21                 {
22                     //出现异常,则回滚
23                     transaction.Rollback();
24                     throw;
25                 }
26             }
27         }

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

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

测试

 1         /// <summary>
 2         /// 添加客户信息
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         protected void btnAdd_Click(object sender, EventArgs e)
 7         {
 8             Guid guidCustomerID = Guid.NewGuid();
 9             var customer = new Customer() { CustomerName = "zhangsan3322", CustomerAddress = "北京 海淀", CustomerID = guidCustomerID };
10             Business.CustomerBusiness customerBusiness = new Business.CustomerBusiness();
11             //使用事务的方式添加客户信息
12             if (customerBusiness.SaveOrUpdateByTrans(customer))
13             {
14                 RepeaterDataBind();
15             }
16             //提供一个名字长度溢出的测试数据
17             customer = new Customer() { CustomerName = "我爱北京天安门,我爱北京,我爱万里长城", CustomerAddress = "上海", CustomerID = Guid.NewGuid()};
18             //使用事务的方式添加客户信息
19             if (customerBusiness.SaveOrUpdateByTrans(customer))
20             {
21                 RepeaterDataBind();
22             }
23         }

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

结果

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

生成的sql

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

总结

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

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。