.Net中的5种工作总计

在3个MIS系统中,没有用工作那就相对是有失常态的,要么就只有一种情形:你的系统实际是太小了,业务工作逻辑有只要一步执行就能够形成了。由此控制事务处理的措施是很重点,进作者的分类在.net中山高校约有以下4种事务处理的艺术。大家能够参照一下,根据实际选拔卓殊的事务处理。
1、SQL事务
    sql事务是采纳SQL server自己的工作:在蕴藏进程中平素利用Begin Tran,Rollback Tran,Commit Tran完成工作:
可取:执行成效至上
限定:事务上下文仅在数据库中调用,难以达成复杂的工作逻辑。
德姆o:(全数demo,都是SQL Server自带的Northwind数据的表Region为例)
带事务的存款和储蓄进程
CREATE PROCEDURE dbo.SPTransaction
    (
    @UpdateID int,
    @UpdateValue nchar(50),
    @InsertID int,
    @InsertValue nchar(50)
    )
AS
begin Tran
Update Region  Set where RegionID=@UpdateID

insert into Region Values (@InsertID,@InsertValue)

declare @RegionError int
select @RegionError=@@error
if(@RegionError=0)
COMMIT Tran
else
ROLLBACK Tran
GO
进行带事务的储存进度
/**//// <summary>
        /// SQL事务:
        /// </summary>
        public void SQLTran()
        {
            SqlConnection conn = new SqlConnection(“Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User );
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = “SPTransaction”;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn;
            conn.Open();
            SqlParameter[] paras= new SqlParameter[]{
                                        new SqlParameter (“@UpdateID”,SqlDbType.Int,32),
                                        new SqlParameter (“@UpdateValue”,SqlDbType .NChar,50),
                                        new SqlParameter (“@InsertID”,SqlDbType.Int ,32),
                                        new SqlParameter (“@InsertValue”,SqlDbType.NChar ,50)};
            paras[0].Value = “2”;
            paras[1].Value = “Update Value1”;
            paras[2].Value = “6”;
            paras[3].Value = “Insert Value1”;
            foreach (SqlParameter para in paras )
            {
                cmd.Parameters.Add(para);
            }
            cmd.ExecuteNonQuery();   
        }

2、ADO.net事务
   Ado.net事务恐怕是豪门一般都用的
 优点:不难,成效和数据库事务差不多。
 缺点:事务不可能跨数据库,只可以在1个数据库连接上。借使是多少个数据库上就不可能接纳该事情了。
Demo:

ADO.net事务
/**//// <summary>
        /// 一般的ADO.net 事务
        /// </summary>
        public void ADONetTran1()
        {
            SqlConnection conn = new SqlConnection(“Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User );
            SqlCommand cmd = new SqlCommand();
            try
            {
                cmd.CommandText = “Update Region Set where RegionID=@UpdateID”;
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conn;
                conn.Open();
                SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter (“@UpdateID”,SqlDbType.Int,32),
                                        new SqlParameter (“@UpdateValue”,SqlDbType .NChar,50)};
                paras[0].Value = “2”;
                paras[1].Value = “Update Value12”;

                foreach (SqlParameter para in paras)
                {
                    cmd.Parameters.Add(para);
                }
                //初始业务
                cmd.Transaction = conn.BeginTransaction();
                cmd.ExecuteNonQuery();

                cmd.CommandText = “insert into Region values(@InsertID,@InsertValue)”;
                cmd.CommandType = CommandType.Text;

                paras = new SqlParameter[]{
                                        new SqlParameter (“@InsertID”,SqlDbType.Int ,32),
                                        new SqlParameter (“@InsertValue”,SqlDbType.NChar ,50)};
                paras[0].Value = “7”;
                paras[1].Value = “Insert Value”;

                cmd.Parameters.Clear();
                foreach (SqlParameter para in paras)
                {
                    cmd.Parameters.Add(para);
                }
                
                cmd.ExecuteNonQuery();
                //提交事务
                cmd.Transaction.Commit();
            }
            catch
            {
                //回滚事务
                cmd.Transaction.Rollback();
                throw;
            }
            finally
            {
                conn.Close();
            }

        }

3、TransactionScope事务
  TransactionScope事务类,它能够使代码块成为事务性代码。并机关升级为分布式事务
 优点:完毕不难,同时能够自行升级为分布式事务
Demo:

TransactionScope事务
 /**//// <summary>
        /// TransactionScope事务:可自行升级业务为完全分布式事务的轻型(本地)事务。 
        /// 使用时要力保MSDTC服务(控制分布事务)是打开的能够行使:net start msdtc命令开启服务;
        /// </summary>
        public void ADONetTran2()
        {
             SqlConnection conn = new SqlConnection(“Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User );
             SqlCommand cmd = new SqlCommand();
            try
            {
              
                using (System.Transactions.TransactionScope ts = new TransactionScope())
                {
                    
                    cmd.CommandText = “Update Region Set where RegionID=@UpdateID”;
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = conn;
                    conn.Open();
                    SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter (“@UpdateID”,SqlDbType.Int,32),
                                        new SqlParameter (“@UpdateValue”,SqlDbType .NChar,50)};
                    paras[0].Value = “2”;
                    paras[1].Value = “Update Value12”;

                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }
                    cmd.ExecuteNonQuery();

                    cmd.CommandText = “insert into Region values(@InsertID,@InsertValue)”;
                    cmd.CommandType = CommandType.Text;

                    paras = new SqlParameter[]{
                                        new SqlParameter (“@InsertID”,SqlDbType.Int ,32),
                                        new SqlParameter (“@InsertValue”,SqlDbType.NChar ,50)};
                    paras[0].Value = “8”;
                    paras[1].Value = “Insert Value”;

                    cmd.Parameters.Clear();
                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }

                    cmd.ExecuteNonQuery();
                    //提交事务
                    ts.Complete();              //提交事务在此以前conn不可能关闭的(Not conn.Close()),否则报错
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }

        }

4、COM+事务
  在分布式应用程序中,往往要同时操作三个数据库,使用数据库事务就无法满意工作的须要了。在COM+中,提供全部的事务处理服务。很便利处理多少个数据库上的事体。

例一:

COM+事务
/**//// <summary>
        /// COM+事务
        /// </summary>
        public void ComTran()
        {
            SqlConnection conn = new SqlConnection(“Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User );
            SqlCommand cmd = new SqlCommand();
            ServiceConfig sc = new ServiceConfig();

            //内定事务类型
            sc.Transaction = TransactionOption.Required;
            //设置运转跟踪
            sc.TrackingEnabled = true;
            //成立3个上下文,该上下文的配备由作为 cfg 参数字传送递的 ServiceConfig 对象来钦定。
            //随后,客户端和劳动器端的策略均被触发,就如发生了三个艺术调用。
            //接着,新的上下文被推至上下文堆栈,成为当前上下文
            ServiceDomain.Enter(sc);
            try
            {
                    cmd.CommandText = “Update Region Set where RegionID=@UpdateID”;
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = conn;
                    conn.Open();
                    SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter (“@UpdateID”,SqlDbType.Int,32),
                                        new SqlParameter (“@UpdateValue”,SqlDbType .NChar,50)};
                    paras[0].Value = “2”;
                    paras[1].Value = “Update Value22”;

                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }
                    cmd.ExecuteNonQuery();

                    cmd.CommandText = “insert into Region values(@InsertID,@InsertValue)”;
SQL Server,                    cmd.CommandType = CommandType.Text;

                    paras = new SqlParameter[]{
                                        new SqlParameter (“@InsertID”,SqlDbType.Int ,32),
                                        new SqlParameter (“@InsertValue”,SqlDbType.NChar ,50)};
                    paras[0].Value = “9”;
                    paras[1].Value = “Insert Value”;

                    cmd.Parameters.Clear();
                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }

                    cmd.ExecuteNonQuery();

                    //提交事务
                    ContextUtil.SetComplete();
            }
            catch
            {
                //回滚事务
                ContextUtil.SetAbort();
                throw;
            }
            finally
            {
                conn.Close();
                //触发服务器端的策略,随后触发客户端的策略,就像是贰个艺术调用正在再次来到。
                //然后,当前上下文被弹出上下文堆栈,调用 Enter 时正值周转的上下文成为近日的上下文。
                ServiceDomain.Leave();
            }

须求特地补充的是:
借使您选取的是遍布事务(TransactionScope事务和COM+事务),在私下认可情状下你是要重新配置安装SQL Server数据库服务器和走访数据库的客户端的.(如果没有配备运维会晤世以下错误:该伙伴事务管理器已经禁止了它对长距离/互连网工作的帮忙。 (非常来自 HRESULT:0x8004D025)
)上边是MSDN上关于配置分布式事务的一段原话:
配备分布式事务
要启用分布式事务,或许要求经过互联网启用 MS DTC,以便在运用使用了新星的 瑟维斯 Pack 的较新操作系统(例如 Windows XP 或 Windows 二零零四)时接纳分布式事务。如若启用了 Windows 防火墙(Windows XP Service Pack 2 的暗中认可设置),必须同意 MS DTC 服务应用网络或打开 MS DTC 端口。
实质上怎么布置呢,经过本人的实际利用:大约如下:打开’控制面板’->’管理工科具’->’组件服务’,点开’组件服务’->’总计机’->’小编的电脑’,在’小编的电脑’上右击属性,点’MSDTC’,然后点’安全性配置’。作为数据库的服务器的安顿如下:

而访问数据库的客户端的配备和服务器端的稍某个差别:

在装置完下边包车型客车还有使防火墙MS DTC 服务使用互联网或打开 MS DTC 端口:运行netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable命令就足以了

ASP.NET事务能够说是在.NET平台上作业达成方式最简便的一种,你只是需求一行代码即可。在aspx的页面注解中加3个附加的属性,即工作属性Transaction=”Required”,它有如下的值:Disabled(暗许)、NotSupported、Supported、Required和RequiresNew,那些设置和COM+及合营社级劳动中的设置同样,典型的几个例子是只要您想在页面上下文中运维工作,那么要将其安装为Required。假使页面中隐含有用户控件,那么这一个控件也会含有到业务中,事务会存在于页面包车型地铁各个地点。 

页面申明Transaction=”Required”:

<%@ Page Transaction=”Required”  Language=”C#” AutoEventWireup=”true” 

CodeBehind=”WebForm3.aspx.cs” Inherits=”WebApplication4.WebForm3″ %>

页面引用:using System.EnterpriseServices;。

然后,数据操作代码:

protected void Button1_Click(object sender, EventArgs e)

{

    try

    {

        Work1();

        Work2();

        ContextUtil.SetComplete();   //提交事务

    }

    catch (System.Exception except)

        ContextUtil.SetAbort();      //打消事务

        Response.Write(except.Message);

    } 

private void Work1()

{

    string conString = “data source=127.0.0.1;database=codematic;user > 

      password=”;

    SqlConnection myConnection = new SqlConnection(conString);

    string strSql = “Insert Into P_Category(CategoryId,Name)values(‘1’,

      ‘test1’)”;

    SqlCommand myCommand = new SqlCommand(strSql, myConnection);

    myConnection.Open();

    int rows = myCommand.ExecuteNonQuery();

    myConnection.Close();

}

private void Work2()

{

    string conString = “data source=127.0.0.1;database=codematic;user > 

      password=”;

    SqlConnection myConnection = new SqlConnection(conString);

    string strSql = “Insert Into P_Category(CategoryId,Name)values(‘2’,

      ‘test2’)”;

    SqlCommand myCommand = new SqlCommand(strSql, myConnection);

    myConnection.Open();

    int rows = myCommand.ExecuteNonQuery();

    myConnection.Close();

}

ContextUtil是用来获取 COM+ 上下文消息的首要选用类。由于此类的成员全部为static,由此在利用其成员在此之前不需求对该类实行实例化。

ASP.NET页面事务的优势和范围如下。

    l限制:页面包车型客车全数代码都以同二个事务,那样的思想政治工作或然会十分的大,而恐怕大家须求的是分别的、小的作业实现在Web层。

⑤ 、ASP.net web 服务工作

略……

相关文章