使用NoSql管理Sql事务

12-07-14 gameboyLV
欢迎围观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")
.....
<p>

注释

①:连接到Redis服务器,检查 Article 领域中主键为 201207010001.shtml 的对象是否被锁定,如果未锁定,则创建一个粗粒度锁,锁定者为 Editor03。

②:201207010001.shtml已被锁定,将异常抛给前端

③:将以下操作委托给数据库 192.168.0.1

④:此处的代码不会立即执行,将进入事务列表,直到Transaction.Commit()

⑤:将事务列表中委托的操作包裹在SqlServer Transaction中一次性提交

⑥:将以下操作委托给数据库 192.168.0.2


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

gameboyLV
2012-07-14 18:25
Redis 首先使用SetNX命令锁定对象,然后使用Expire命令设置锁定事务的超时时间

如果在超时时间内所有Sql服务器报告执行结果正常,则使用Del命令删除锁定,然后返回事务成功

[该贴被gameboyLV于2012-07-14 18:30修改过]

banq
2012-07-15 10:17
是个大胆的尝试,很有新意啊。

猜你喜欢