[转]NHibernate之旅(6):探索NHibernate中的事务
本节内容
- 事务概述
- 1.新建对象
- 【测试成功提交】
- 【测试失败回滚】
- 2.删除对象
- 3.更新对象
- 4.保存更新对象
- 结语
上一篇我们介绍了NHibernate中的Insert, Update, Delete操作,这篇我们来看看NHibernate中的事务。你通过它可以提交或者回滚你的操作。
事务概述
1.NHibernate中的事务(Transactions)
简单描述:要求ISession使用事务;做一些操作;提交或者回滚事务。
写成代码就像这样:
ITransaction tx = _session.BeginTransaction();
//一些保存、更新、删除等操作
tx.Commit();
实际上在NHibernate使用事务要使用using强制资源清理和异常机制,一般像这样:
using (ITransaction tx = _session.BeginTransaction())
{
try
{
//一些保存、更新、删除等操作
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
2.什么时候使用事务?
回答是:在任何时候都要使用事务,即使是在读取、查询数据的时候,为什么呢?因为你不清楚数据库什么时候操作失败,如何恢复原来数据。而NHibernate中的事务(可以通过 tx.Rollback()方法),帮助我们完成这些事情。
下面看看例子,我们修改上篇的Insert、Update、Delete操作:
1.新建对象
public int CreateCustomerTransaction(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
int newId = (int)_session.Save(customer);
_session.Flush();
tx.Commit();
return newId;
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
这篇以新建对象为例,分别从成功提交和失败回滚两个角度来测试这个方法。
【测试成功提交】
首先写一个测试用例,假设这个测试可以运行成功:
[Test]
public void CreateCustomerTransactionTest()
{
var customer = new Customer() { Firstname = "YJing", Lastname = "Lee" };
int newIdentity = _transaction.CreateCustomerTransaction(customer);
var testCustomer = _transaction.GetCustomerById(newIdentity);
Assert.IsNotNull(testCustomer);
}
测试这个方法,使用TestDriven.NET集成的NCover(分析代码的覆盖率)查看代码运行覆盖率,在这个测试方法上右击选择“Test With”—“Coverage”,如下图所示:
这时自动打开NCoverExplorer(查看代码覆盖率的分析结果),我们可以看到CreateCustomerTransaction方法运行覆盖情况,我们发现这个方法通过事务成功提交了操作并返回新的Id。分析结果效果图如下所示:
【测试失败回滚】
我们在写一个失败回滚的测试,由于我认为设置了一个“将截断字符串或二进制数据”错误,这时必须在测试方法上指定测试预期的异常。
[Test]
[ExpectedException(typeof(NHibernate.HibernateException))]
public void CreateCustomerThrowExceptionOnFailTest()
{
var customer = new Customer()
{
Firstname = "012345678901234567890123456789012345678901234567890123456789",
Lastname = "YJingLee"
};
_transaction.CreateCustomerTransaction(customer);
}
同理按上面的步骤测试这个方法看看CreateCustomerTransaction方法运行情况,由于出现错误(这里是“将截断字符串或二进制数据”错误),所以系统抛出了HibernateException异常,此时系统发生回滚。分析结果效果图如下所示:
2.删除对象
我们修改上例中的删除对象的代码,如下所示:
public void DeleteCustomerTransaction(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Delete(customer);
_session.Flush();
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
3.更新对象
我们修改上例中的更新对象的代码,如下所示:
public void UpdateCustomerTransaction(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Update(customer);
_session.Flush();
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
4.保存更新对象
我们修改上例中的保存更新对象的代码,如下所示:
public void SaveOrUpdateCustomersTransaction(IList<Customer> customers)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
foreach (Customer c in customers)
_session.SaveOrUpdate(c);
_session.Flush();
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
好了,由于篇幅有限,上面三个方法在这里我就不测试了,大家可以参考创建对象测试的步骤来测试一下其他几个方法吧!
结语
感觉这节内容很少的样子,在NHibernate官方文档中对事务讲解的并不多,自己挖空心思也就挤了这么多东西。不过在这一节带领大家学会了测试工具TestDriven.NET的另一个功能就是怎么查看代码运行覆盖率,还是有一点收获的哦。下一节想继续深入事务话题一起讨论NHibernate中的并发控制,到现在还没有想好怎么写呢,希望大家对这个系列给出意见和建议。谢谢支持!
[转]NHibernate之旅(6):探索NHibernate中的事务的更多相关文章
- [转]NHibernate之旅(10):探索父子(一对多)关联查询
本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...
- NHibernate之旅(21):探索对象状态
本节内容 引入 对象状态 对象状态转换 结语 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的 ...
- NHibernate之旅系列文章导航
NHibernate之旅系列文章导航 宣传语 NHibernate.NHibernate教程.NHibernate入门.NHibernate下载.NHibernate教程中文版.NHibernate实 ...
- NHibernate之旅(18):初探代码生成工具使用
本节内容 引入 代码生成工具 结语 引入 我们花了大量的篇幅介绍了相关NHibernate的知识.一直都是带着大家手动编写代码,首先创建数据库架构.然后编写持久化类和映射文件,最后编写数据操作方法.測 ...
- [转]NHibernate之旅(12):初探延迟加载机制
本节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这 ...
- Fluent NHibernate之旅
Fluent NHibernate 之旅 导航篇: [原创]Fluent NHibernate之旅开篇: [原创]Fluent NHibernate之旅二--Entity Mapping: [原创]F ...
- [转]NHibernate之旅(1):开篇有益
本节内容 NHibernate是什么 NHibernate的架构 NHibernate资源 欢迎加入NHibernate中文社区 作者注:2009-11-06已更新 NHibernate开篇有益 学习 ...
- NHibernate系列文章八:NHibernate对象一级缓存
摘要 Nhibernatea缓存非常强大,按照缓存存储在Session对象还是SessionFactory对象分为一级缓存和二级缓存. 一级缓存存在于Session对象里,也叫Session缓存,由S ...
- 通俗易懂的Nhibernate教程(2) ---- 配置之Nhibernate配置
在上一个教程中,我们讲了Nhibernate的基本使用!So,让我们回顾下Nhibernate使用基本的步骤吧 1.NHibernate配置 ----- 这一步我们告诉了Nhibernate:数据库 ...
随机推荐
- Ibatis中sqlmap参数map中还需要套list的情况如何写?
原始需求: 有若干个参数,需要作为ibatis拼装sql的参数传入,但是有个参数的值比较特殊,是若干种枚举值.具体到这个case,就是有有限个namespace.我每次需要通过传入多个namespac ...
- initrd.gz的解压和制作
解压: gzip -d initrd.gz cpio -idmv < initrd 压缩: find . | cpio -o -c > initrd.img gzip initrd.img ...
- python【第二十篇】Django表的多对多、Ajax
1 创建多对多表的方式有两种 1.1 方式一:自定义关系表 class Host(models.Model): nid = models.AutoField(primary_key=True) hos ...
- Django生产环境的部署-Apache-mod_wsgi
httpd.conf配置 ServerSignature On ServerTokens Full Define APACHE24 Apache2.4 Define SERVER_BASE_DIR & ...
- Codeforces Round #336 (Div. 2) D. Zuma
Codeforces Round #336 (Div. 2) D. Zuma 题意:输入一个字符串:每次消去一个回文串,问最少消去的次数为多少? 思路:一般对于可以从中间操作的,一般看成是从头开始(因 ...
- uublog在线测试demo
http://demo.uublog.me/ 后台 http://demo.uublog.me/admin/ 用户名/密码:admin/admin
- 修改tabbar 字体颜色
NSDictionary *seletedTextAttrs = @{NSForegroundColorAttributeName:[UIColor orangeColor]}; 修改tabbar 字 ...
- Array 原型扩展(快速排序,搅乱顺序)
/// 快速快速排序算法Array.prototype.quickSort = function (left, right) { // left = left || 0; // right = rig ...
- bootstrap兼容IE8 解决办法
bootstrap有使用CSS3,所以ie9以下浏览器不会很顺畅.IE9以下的兼容性不是很好.IE本身就是怪胎,就搞一些和外界标准不一致.搞得web开发考虑这考虑那的兼容性,蛋疼! 基本上css3的没 ...
- 50个实用的jQuery代码段让你成为更好的Web前端工程师
本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助 ...