步步为营VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理

作者:webabcd

介绍
以Northwind为示例数据库,DLINQ(LINQ to SQL)之事务处理和并发处理

示例
TransactionAndConcurrency.aspx

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="TransactionAndConcurrency.aspx.cs"
        Inherits="LINQ_DLINQ_TransactionAndConcurrency" Title="事务处理和并发处理" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
        事务处理和并发处理详见:TransactionAndConcurrency.aspx.cs
</asp:Content>

TransactionAndConcurrency.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;

using DAL;
using System.Transactions;

public partial class LINQ_DLINQ_TransactionAndConcurrency : System.Web.UI.Page
{
        protected void Page_Load(object sender, EventArgs e)
        {
                // 事务处理(DataContext.SubmitChanges()会做默认的事务处理)
                TransactionDemo1();

                // 事务处理(用DataContext.Connection.BeginTransaction()的方式做事务处理)
                TransactionDemo2();

                // 事务处理
                TransactionDemo3();

                // 并发处理
                Concurrency();
        }

        /// <summary>
        /// 事务处理(DataContext.SubmitChanges()会做默认的事务处理)
        /// </summary>
        private void TransactionDemo1()
        {
                try
                {
                        NorthwindDataContext ctx = new NorthwindDataContext();

                        ctx.Categories.InsertOnSubmit(new Categories { CategoryName = "test", Description = "test" });
                        ctx.Categories.InsertOnSubmit(new Categories { CategoryID = 1 });

                        ctx.SubmitChanges();
                }
                catch
                { }
        }

        /// <summary>
        /// 事务处理(用DataContext.Connection.BeginTransaction()的方式做事务处理)
        /// </summary>
        private void TransactionDemo2()
        {
                int? categoryId = null;

                NorthwindDataContext ctx = new NorthwindDataContext();

                if (ctx.Connection.State != ConnectionState.Open)
                {
                        ctx.Connection.Open();
                }

                System.Data.Common.DbTransaction tran = ctx.Connection.BeginTransaction();
                ctx.Transaction = tran;

                try
                {
                        ctx.AddCategory("test", "test", ref categoryId);
                        ctx.DeleteCategory(1);

                        tran.Commit();
                }
                catch
                {
                        tran.Rollback();
                }
        }

        /// <summary>
        /// 事务处理(用System.Transactions.TransactionScope做事务处理)
        /// </summary>
        private void TransactionDemo3()
        {
                int? categoryId = null;

                using (TransactionScope tc = new TransactionScope())
                {
                        try
                        {
                                NorthwindDataContext ctx = new NorthwindDataContext();
                                
                                ctx.AddCategory("test", "test", ref categoryId);
                                ctx.DeleteCategory(1);

                                tc.Complete();
                        }
                        catch
                        { }
                }
        }

        /// <summary>
        /// 并发处理
        /// </summary>
        private void Concurrency()
        {
                // 修改字段的UpdateCheck为Never,可在对象关系设计器(Object Relational Designer)中修改
                // [Column(Storage="_UnitPrice", DbType="Money")]
                // [Column(Storage="_UnitPrice", DbType="Money", UpdateCheck=UpdateCheck.Never)]

                NorthwindDataContext ctx = new NorthwindDataContext();

                var products = ctx.Products;

                foreach (var p in products)
                {
                        p.UnitPrice ++;
                }

                try
                {
                        // 表示即使发生冲突也要继续
                        ctx.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
                }
                catch (System.Data.Linq.ChangeConflictException e)
                {
                        foreach (System.Data.Linq.ObjectChangeConflict occ in ctx.ChangeConflicts)
                        {
                                Products p = (Products)occ.Object;

                                // 以当前客户端中的值为准
                                occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);

                                // 以当前数据库中的值为准
                                occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);

                                // 如果数据库中的值没有发生变化,则以当前客户端中的值为准。否则,则以当前数据库中的值为准
                                occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);

                                foreach (System.Data.Linq.MemberChangeConflict mcc in occ.MemberConflicts)
                                {
                                        // 当前客户端中的值
                                        string currentValue = mcc.CurrentValue.ToString();
                                        
                                        // 原来数据库中的值
                                        string originalValue = mcc.OriginalValue.ToString();
                                        
                                        // 当前数据库中的值
                                        string databaseValue = mcc.DatabaseValue.ToString();

                                        // 以当前客户端中的值为准
                                        mcc.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);

                                        // 以当前数据库中的值为准
                                        mcc.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);
                                        
                                        // 如果数据库中的值没有发生变化,则以当前客户端中的值为准。否则,则以当前数据库中的值为准
                                        mcc.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
                                }
                        }

                }

                // 表示只要发生冲突就不再继续
                ctx.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);    
                
                // ctx.SubmitChanges();
        }
}

OK
[源码下载]

本文出自 “webabcd” 博客,请务必保留此出处http://webabcd.blog.51cto.com/1787395/345015

.NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理相关推荐

  1. .NET 3.5 - DLINQ(LINQ to SQL)之面向对象的添加、查询、更新和删除

    步步为营VS 2008 + .NET 3.5(8) - DLINQ(LINQ to SQL)之面向对象的添加.查询.更新和删除 作者:webabcd 介绍 以Northwind为示例数据库,DLINQ ...

  2. .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录

    步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页.延迟执行和日志记录 作者:webabcd 介绍 以Northwind为示例数据库,DLIN ...

  3. 一步一步学Linq to sql(一):预备知识

    从今天起将推出新手讲堂,首先从linq开始详细讲解.一步一步学Linq to sql(一):预备知识 什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集 ...

  4. LINQ To SQL 语法及实例大全

    LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子 ...

  5. ADO.net,Linq to SQL和Entity Framework性能实测分析

    [测试总结] 第一阶段测试结果非常出人意料,ADO.net和LINQ to SQL操作数据的时间都控制在0.5秒以内,非常的迅速,但是Entity Framework在添加这步表现非常差,由于这五步是 ...

  6. Linq to sql与EF零碎知识点总结

    ------------------------------第一天(2013-3-25) 1.ado.net实体模型,(Ef) 2.创建上下文对象: 调用相应方法,最后调用.savechanges() ...

  7. linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)

    ,我们做了基于linq to sql 的多条件组合查询,但通过监视数据库发现,这样做的成本比较高,每次都要取出全部的数据到内存进行筛选.如何从真正意义上做到延迟加载,即一次只从数据库中取我们需要的用到 ...

  8. 使用LINQ解除SQL注入安全问题

    在开发人员承受越来越多的安全责任之时,许多开发人员了解到的第一个Web应用安全漏洞,是一个被称为"SQL注入"的极危险的命令注入形式.命令注入的原始的形式本是指这样一种漏洞:攻击者 ...

  9. 艾伟_转载:使用LINQ to SQL更新数据库(上):问题重重

    在学习LINQ时,我几乎被一个困难所击倒,这就是你从标题中看到的更新数据库的操作.下面我就一步步带你走入这泥潭,请准备好砖头和口水,Follow me. 从最简单的情况入手 我们以Northwind数 ...

最新文章

  1. Oracle --存储过程,输入不定个数参数
  2. 牛客题霸 NC8 二叉树根节点到叶子节点和为指定值的路径
  3. Keras实现LeNet-5网络,与可视化网络
  4. 18 PP配置-生产计划-检查 MRP 元素的文本
  5. linux-基本开发环境搭建
  6. 双11拼团最后的福利!老用户如何解散团并加入新团!
  7. python程序设计pdf机械出版_Python程序设计
  8. FPGA入门程序(1)——流水灯
  9. 基于javaweb的校园自行车租赁管理系统(java+jsp+javascript+servlet+mysql)
  10. Excel直接跳过隐藏行,粘贴数据到可见单元格
  11. 连接SQLserver数据库发生错误,提示用户sa登录失败解决方法(亲试有用)
  12. c语言函数大全 chm,c语言常用函数手册 chm格式.doc
  13. OutOfMemoryError(OOM)和StackOverflowError(SOF)异常总结
  14. 【操作系统】30天自制操作系统--(1)虚拟机加载最小操作系统
  15. 系统问题调试:appcrash
  16. 认识植物 - 水杉 (比较常见的濒危植物)
  17. JS鼠标放上移开 显示隐藏图标 的代码思路
  18. Win10+VS2017的C++属性配置表
  19. ArchSummit深圳2016优秀演讲公布,北京站专题抢先看
  20. 購物籃分析,最清楚概念-part1

热门文章

  1. 用visio画用例图小人_教你如何用 Python 打飞机 ?
  2. numpy 读写 npy npz 文件
  3. python 获取程序运行时间
  4. 模型加速--CLIP-Q: Deep Network Compression Learning by In-Parallel Pruning-Quantization
  5. 重温目标检测--YOLO v1
  6. 人脸检测--SSH: Single Stage Headless Face Detector
  7. ASP .NET Core使用connection string连接MySQL/MariaDB,并设置UTF-8编码
  8. pycharm中R工具包的安装
  9. 什么是Hystrix
  10. SpringBoot获取请求的参数