使用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 class="indent"> 注释①:连接到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 是个大胆的尝试,很有新意啊。