问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在VB中,怎样对SQL进行事务处理

发布网友 发布时间:2022-04-08 23:02

我来回答

2个回答

懂视网 时间:2022-04-09 03:23

:简单说就访问并可能更新数据库中各种数据项的一个程序执行单元,一旦开启事务,所有对数据的操作要么全部执行,要么全部都不执行。单条sql语句本身就是一个事务.

事务的属性:

  事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有4个属性,称为原子性(Atomic)、 一致性(Consistent)、隔离性(Isolated)、持久性(Durable),简称ACID属性,只有这样才能构成一个事务。

  原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

  隔离性:两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。

  持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

工作开发过程中对事务的依赖性很强,复杂一点的sql操作一般都离不开事务.

举个很简单的例子,银行转账是简单可以分为两个步骤

如:账号A向账号B转1000元钱。

1、账号B+1000元;

2、账号A-1000元;

这两步是不可分的,假如账号B+1000元后,执行第二步发现账号A余额不足时(当然实际开发中会先判断余额,这里是假设),执行失败,那么账号B就多出了1000元,而账号A却没减去1000元。

有了事务我们就可以保证这两步要么全部执行,要么全部不执行。

伪代码:

begin 事务

  update 账号表 set money=money+1000 where 账号=账号B;

  update 账号表 set money=money-1000 where 账号=账号A;

if 程序报错

  rollback 事务;

else

  commit 事务;

--------------------------------------------------------------------------------------------------------------------------------

sql代码

1 create table tbl_test(
2 id nvarchar(10),
3 name nvarchar(5)
4 );
5 insert into tbl_test values(‘001‘,‘名字1‘);
6 update tbl_test set name=‘名字2‘ where id=‘001‘
7 update tbl_test set name=‘名字超过5字‘ where id=‘001‘ --这句话会报错 将截断字符串或二进制数据。

 

上面的代码最后执行完,会将名字1改为名字2

加上事务

 1 begin transaction
 2 update tbl_test set name=‘名字2‘ where id=‘001‘;
 3 update tbl_test set name=‘名字超过5字‘ where id=‘001‘;
 4 if @@error <> 0
 5 begin
 6  rollback transaction
 7 end
 8 else
 9 begin
10  commit transaction 
11 end

执行结果name字段的值还是名字1,第二句update执行失败了之后,第一句update也没有执行。

另一种写法:T-sql是有异常机制的

 1 begin try
 2 begin transaction
 3  update tbl_test set name=‘名字2‘ where id=‘001‘;
 4  update tbl_test set name=‘名字超过5字‘ where id=‘001‘;
 5  commit transaction 
 6 end try
 7 begin catch
 8 --select ERROR_NUMBER() as 错误代码 
 9 rollback transaction 
10 end catch

 

sql-事务处理

标签:

热心网友 时间:2022-04-09 00:31

事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下3种总结整理如下:

方法1:直接写入到sql 中

在存储过程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 实现 

begin trans

declare @orderDetailsError int,@procuntError int

delete from [order details] where proctid=42

select @orderDetailsError =@@error

delete from procts where proctid=42

select @procuntError=@@error

if(@orderDetailsError =0 and @procuntError=0)

COMMIT TRANS

else

ROLLBACK TRANS

优点:

  所有事务逻辑包含在一个单独的调用中

  拥有运行一个事务的最佳性能

  独立于应用程序

*:

  事务上下文仅存在于数据库调用中

  数据库代码与数据库系统有关


方法2 :使用ADO.NET 实现 

使用ADO.NET 实现,使用这种方式的优点是可以在中间层来管理事务,当然你也可以选择在数据层来实现。

SqlConnection 和OleDbConnection  对象有一个 BeginTransaction 方法,它可以返回 SqlTransaction 

或者OleDbTransaction 对象。而且这个对象有 Commit 和 Rollback 方法来管理事务 

   SqlConnection sqlConnection = new SqlConnection("workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False");

   sqlConnection.Open();

   SqlTransaction  myTrans = sqlConnection.BeginTransaction();

   SqlCommand sqlInsertCommand = new SqlCommand();

   sqlInsertCommand.Connection = sqlConnection

   sqlInsertCommand.Transaction=myTrans;

   try{

       sqlInsertCommand.CommandText="insert into tbTree(Context,ParentID) values('北京',1)";

       sqlInsertCommand.ExecuteNonQuery();

       sqlInsertCommand.CommandText="insert into tbTree(Context,ParentID) values('上海',1)";

       sqlInsertCommand.ExecuteNonQuery();

       myTrans.Commit();

     }catch(Exception ex)

     {

      myTrans.Rollback();

     }

    finally

    {

     sqlConnection.Close();

    }

优点:

     简单性 

     和数据据事务差不多的快 

     独立于数据库,不同数据库的专有代码被隐藏了 

缺点:

     事务不能跨越多个数据库连接 

     事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接

     ADO.NET分布事务也可以跨越多个数据库,但是其中一个SQL SERVER 数据库的话,通过用SQL SERVER连接服务器连接到别的数据库,但是如果是在DB2和Orcal之间就不可以。

以上两种事务是经常用到的事务处理方法。


方法3  COM+事务(分布式事务)

.NET Framework 依靠 MTS/COM+ 服务来支持自动事务。COM+ 使用 Microsoft Distributed Transaction Coordinator (DTC) 作为事务管理器和事务协调器在分布式环境中运行事务。

这样可使 .NET 应用程序运行跨多个资源结合不同操作(例如,将定单插入 SQL Server 数据库、将消息写入 Microsoft 消息队列 (MSMQ) 队列、以及从 Oracle 数据库检索数据)

的事务。

   COM+事务处理的类必须继承System.EnterpriseServices.ServicedComponent,其实web service就是继承System.EnterpriseServices.ServicedComponent,所以web service也支持

COM+事务。

   定义一个COM+事务处理的类

        [Transaction(TransactionOption.Required)]

 public class DataAccess:System.EnterpriseServices.ServicedComponent

 {

        }

TransactionOption枚举类型支持5个COM+值(Disabled,NotSupported,Required,RequiresNew,Supported)

Disabled      忽略当前上下文中的任何事务。 

NotSupported  使用非受控事务在上下文中创建组件。 

Required      如果事务存在则共享事务,并且如有必要则创建新事务。 

RequiresNew   使用新事务创建组件,而与当前上下文的状态无关。 

Supported     如果事务存在,则共享该事务。 

一般来说COM+中的组件需要Required 或Supported。当组件用于记录或查帐时RequiresNew 很有用,因为组件应该与活动中其他事务处理的提交或回滚隔离开来。

派生类可以重载基类的任意属性。如DataAccess选用Required,派生类仍然可以重载并指定RequiresNew或其他值。

 

COM+事务有手动处理和自动处理,自动处理就是在所需要自动处理的方法前加上[AutoComplete],根据方法的正常或抛出异常决定提交或回滚。

手动处理就是调用ContextUtil类中EnableCommit,SetComplete,SetAbort方法。

            public string  testTransaction()

  {

   try

   {

    ContextUtil.EnableCommit();

    InsertARecord1();

    InsertARecord2();

                                ContextUtil.SetComplete();

    return "succeed!";

   }

   catch(Exception ex)

   {

    ContextUtil.SetAbort();

           return "failed!";

   }    

  }

             public void InsertARecord1()

  {

   

    string strconn="workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False";

    SqlConnection conn=new SqlConnection(strconn);

    conn.Open();

    SqlCommand command=new SqlCommand("insert into tbTree(Context,ParentID) values('北京',1)",conn);

    command.ExecuteNonQuery();

    conn.Close();         

     

  }

              public void InsertARecord2()

  {

   

    string strconn="workstation id=WEIXIAOPING;packet size=4096;user id=sa;initial catalog=Northwind;persist security info=False";

    SqlConnection conn=new SqlConnection(strconn);

    conn.Open();

    SqlCommand command=new SqlCommand("insert into tbTree(Context,ParentID) values('上海',1)",conn);

    command.ExecuteNonQuery();

    conn.Close();     

  }

在需要事务跨 MSMQ 和其他可识别事务的资源(例如,SQL Server 数据库)运行的系统中,只能使用 DTC 或 COM+ 事务,除此之外没有其他选择。DTC 协调参与分布式事务的所有资源管理器,  也管理与事务相关的操作。 

这种做法的缺点是,由于存在 DTC 和 COM 互操作性开销,导致性能降低。

COM+事务处理的类必须强命名。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
CAD具体是学什么的 cad学什么专业好 CAD属于什么课型 文胸36/80是什么尺码 21.22.23.24.25.这5个数横竖家起来都要等于69 21.22.23.24.25.5个数字横竖等于69怎么做 已知递增的等差数列{an}满足a1=1,a3=a2²-4,则an=? 已知递增等差数列an的前n项和为Sn,a1=1,且a2+1,a4+1,S4成等比数列 求数... 金鱼吊兰有什么作用,可供观赏改善风水 金鱼吊兰是什么植物? qq聊天中的草稿怎么删?草稿太长~都卡机了~肿么办(&#3237;_&#3237;)慢慢删太恐怖了……_百度问一问 这种框架图是哪个软件做的,求助! 手机上有没有可以设计3D结构的软件,比如设计一个楼房的结构图,求推荐 手机app界面框架展示图用什么软件来做? 洗脸池放在客厅,有这么设计的么 双台盆有必要吗?相比于单台盆有哪些优缺点? 充电宝哪些不能带上飞机??还有这个可以带上去吗?? ipad六代外屏和内屏是分开的吗? 我要加对方微信,对方说你把你的写给我。是什么意思? 我要加加拿大怎么加 胖女人人搜,我要加 苹果ipad air屏幕是不是分内屏和外屏的吗 如何让别人加我 在家炸薯片的做法步骤 为什么快手上有人让我加他什么意思 谁能告诉我想加微信夏制到哪找? 我要加怎么加 我要加入别人微信,既没电话号又没怎么加? 我想加一个人的怎么加? 我要加对方微信,对方说你把你的写给我。是什么意思? 怎样把qq的说说草稿删除 solo3耗电特别快怎么办 qq说说的草稿怎么弄掉 solo3充不进去电 充电时指示灯也亮 QQ找回密码怎么跳过人脸识别 solo3为什么老是闪光 福瑞安康重疾险保多久 橡皮树要怎样莳养? 我买的中国人寿福瑞安康疾病险,子宫腺肌瘤能理赔吗? 平安保险的平安福和人寿保险的福瑞安康那个好? 安联重大疾病保险有哪些 安联附加安康福瑞长期重大疾病保险怎么样 中国人寿的福瑞安康和农银人寿的金穗安康对比哪个好些 重大疾病保险保的是 苹果商店里怎么没有佳能打印? 手机app佳能打印找不到文档的位置 之前用的是小米手机,然后换掉了想在别的牌子上手机如何保存小米... 苹果5id锁怎么解? 苹果5怎么解锁id 苹果5 ID忘记了,已经刷机,怎样解锁ID锁