天天看點

步步為營VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事務處理和并發處理

步步為營VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事務處理和并發處理

介紹

以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 

                { } 

        /// 事務處理(用DataContext.Connection.BeginTransaction()的方式做事務處理) 

        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; 

                        ctx.AddCategory("test", "test", ref categoryId); 

                        ctx.DeleteCategory(1); 

                        tran.Commit(); 

                        tran.Rollback(); 

        /// 事務處理(用System.Transactions.TransactionScope做事務處理) 

        private void TransactionDemo3() 

                using (TransactionScope tc = new TransactionScope()) 

                        try 

                        { 

                                NorthwindDataContext ctx = new NorthwindDataContext(); 

                                ctx.AddCategory("test", "test", ref categoryId); 

                                ctx.DeleteCategory(1); 

                                tc.Complete(); 

                        } 

                        catch 

                        { } 

        /// 并發處理 

        private void Concurrency() 

                // 修改字段的UpdateCheck為Never,可在對象關系設計器(Object Relational Designer)中修改 

                // [Column(Storage="_UnitPrice", DbType="Money")] 

                // [Column(Storage="_UnitPrice", DbType="Money", UpdateCheck=UpdateCheck.Never)] 

                var products = ctx.Products; 

                foreach (var p in products) 

                        p.UnitPrice ++; 

                        // 表示即使發生沖突也要繼續 

                        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(); 

}

     本文轉自webabcd 51CTO部落格,原文連結:http://blog.51cto.com/webabcd/345015,如需轉載請自行聯系原作者