zoukankan
html css js c++ java
步步为营VS 2008 + .NET 3.5(12) DLINQ(LINQ to SQL)之事务处理和并发处理
[索引页]
[源码下载]
步步为营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
[源码下载]
查看全文
相关阅读:
微软发布TFS 2018!
Git小技巧:VIM中如何填写注释信息
为某金融企业的IT技术部人员提供基于TFS的软件研发流程介绍
【TFS 2017】使用浏览器上传文件(TFVC)或者编辑代码,错误提示TF14098,需要对文件有PendChange 权限
TFS 2017 培训
签入代码(新建分支,新建推拉请求)关联工作项,却找不到自己需要的工作项
TFS支持移动设备,微软已经走出了第一步(手机上更新、查询工作项)
在TFS持续集成(持续发布)中执行Telnet任务
Nginx
单点登录
原文地址:https://www.cnblogs.com/webabcd/p/935450.html
最新文章
RvmTranslator6.0
RvmTranslator6.0
Qt源码编译
occActiveX
OpenCascade Ruled Surface
OpenCASCADE构造一般曲面
OpenCASCADE入门指南
OpenCASCADE 公众号
船舶管子零件图程序-材料列表
DOM 事件监听 事件冒泡 事件捕获
热门文章
JavaScript HTML DOM 事件
JavaScript HTML DOM
JavaScript HTML DOM
AJAX 简介
javascript:void(0);用法及常见问题解析
js数组与字符串的相互转换方法
sublime3安装javascript控制台环境 方法2
sublime3安装javascript控制台环境 方法1
探索TFS Git 库文件换行(CRLF)的处理方式
Get User CustomNotificationAddresses
Copyright © 2011-2022 走看看