使用NoSql管理Sql事务

欢迎围观KylinORM系列文章:

第一篇:使用Tag网络维护实体关系
第二篇:基于业务驱动的领域服务
第三篇:使用领域事件模拟A O P注入
第四篇:使用NoSql管理Sql事务

常见的事务处理有三种:
1、使用线程锁锁定某个方法,避免并发操作
2、使用数据库锁机制锁定表或数据行
3、使用ORM框架内置的脏读校验功能

第一种方法只能避免当前服务器的并发操作,当相同的代码部署在多台服务器上,就无能为力了。
第二钟方法不支持跨数据库事务,现在的大型应用都至少使用了2种以上类型的数据库。
第三种方法需要更改数据库结构,增加时间戳或版本字段,或在执行UPDATE语句时产生大量的校验代码。

难道就没有方法支持云计算环境下,跨多种类型数据库的事务么?嘿嘿~~试试KylinORM的“云”锁定吧 =.=


//注释①
LockManager locker = LockManager.Define(
"Article", "201207010001.shtml", "Editor03");
if (!locker.Enter())
{
//注释②
throw new Exception(
"201207010001.shtml is locked by " + locker.HeldOwner);
}

//注释③
TransactionManager.Define(
"192.168.0.1")
.AddMethod(cmd =>
{
//注释④
pojoRP.Use(cmd).Create(new PojoEntity { UserName =
"李四" });
})
.AddMethod(cmd =>
{
pojoRP.Use(cmd).Create(new PojoEntity { UserName =
"李四" });
})
//注释⑤
.Commit();
//注释⑥
TransactionManager.Define(
"192.168.0.2")
.....

注释
①:连接到Redis服务器,检查 Article 领域中主键为 201207010001.shtml 的对象是否被锁定,如果未锁定,则创建一个粗粒度锁,锁定者为 Editor03。
②:201207010001.shtml已被锁定,将异常抛给前端
③:将以下操作委托给数据库 192.168.0.1
④:此处的代码不会立即执行,将进入事务列表,直到Transaction.Commit()
⑤:将事务列表中委托的操作包裹在SqlServer Transaction中一次性提交
⑥:将以下操作委托给数据库 192.168.0.2


相关示例和文档请参见 http://kylinorm.codeplex.com/

Redis 首先使用SetNX命令锁定对象,然后使用Expire命令设置锁定事务的超时时间
如果在超时时间内所有Sql服务器报告执行结果正常,则使用Del命令删除锁定,然后返回事务成功
[该贴被gameboyLV于2012-07-14 18:30修改过]

是个大胆的尝试,很有新意啊。