• 代码块事务—TransactionScope


    今天上班遇到这样的业务:将删除的用户信息记录到记录表,再删除用户表中的信息。

    可以说是不幸也可以说是幸运的。

    在以往遇到这样的业务,我会考虑到各种出现异常或者失败的情况。在删除一张表数据失败的情况,对另一张表的操作也要还原。

    但是今天,删除用户表失败时,无法删除刚刚记录到记录表的信息,因为没有一个条件可以筛选出我刚刚记录到记录表中的数据。

    想到了代码块事务:TransactionScope

    TransactionScope类的命名空间是System.Transactions,位于 System.Transactions.dll。

    在.net2.0后出现了ransactionScope类,大大简化了事务的设计。并且该类型是线程安全的。

    在实例化 TransactionScope 通过 new 语句中,事务管理器确定哪些事务参与进来。 一旦确定,该范围将始终参与该事务。 

    如果在事务范围内未不发生任何异常 (即之间的初始化 TransactionScope 对象并调用其 Dispose 方法),则范围所参与的事务可以继续。如果在事务范围内发生异常,参与到其中的事务将回滚。

    当应用程序完成所有工作时它想要在事务中执行,应调用 Complete 方法一次,以通知该事务管理器是可接受,即可提交事务。未能调用此方法中止事务。

    调用 Dispose 方法将标记事务范围的末尾。 在调用此方法之后所发生的异常不会影响事务。

    以下两个方法使用最多“”

              Complete()      指示范围内的所有操作都已成功都完成。
              Dispose()        结束事务范围。

    我有一张订单表,一张客户表

    客户表脚本

    CREATE TABLE [dbo].[Customer](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [CustomerName] [nvarchar](32) NOT NULL,
        [SubTime] [datetime] NOT NULL,
        [CustomerPwd] [nvarchar](32) NOT NULL,
     CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO

    订单表脚本

    CREATE TABLE [dbo].[OrderInfo](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [OrderId] [nvarchar](255) NOT NULL,
        [SubTime] [datetime] NOT NULL,
        [CustomerID] [int] NOT NULL,
     CONSTRAINT [PK_OrderInfo] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[OrderInfo]  WITH CHECK ADD  CONSTRAINT [FK_CustomerOrderInfo] FOREIGN KEY([CustomerID])
    REFERENCES [dbo].[Customer] ([ID])
    GO
    
    ALTER TABLE [dbo].[OrderInfo] CHECK CONSTRAINT [FK_CustomerOrderInfo]
    GO  

    客户表Customer和订单表OrderInfo是一对多的关系,一个客户可以由多个订单。

    增加一条客户信息和两条订单信息

     /// <summary>
            /// 添加客户与订单
            /// </summary>
            private void AddCustomerOrderInfo()
            {
                try
                {
                    using (TransactionScope scope = new TransactionScope())
                    {
                        TestEntities db = new TestEntities();
                        Customer customer = new Customer() { CustomerName = "admin123", CustomerPwd = "123456", SubTime = DateTime.Now};
                        db.Customer.Add(customer);
                        db.SaveChanges();
    
                        OrderInfo orderInfo1 = new OrderInfo() { OrderId = "10003", SubTime = DateTime.Now, Customer = customer };
                        OrderInfo orderInfo2 = new OrderInfo() { OrderId = "10004", SubTime = DateTime.Now, Customer = customer };
                        db.OrderInfo.Add(orderInfo1);
                        db.OrderInfo.Add(orderInfo2);
                        db.SaveChanges();//工作单元模式。
    
                        //提交事务,当失败的时候自动回滚。
                        scope.Complete();
                    }
                }
                catch (TransactionAbortedException ex)
                {
                   
                }
                catch (Exception ex)
                {
                    
                }
            }
  • 相关阅读:
    [PHP] thinkphp5 单入口多个模块绑定和路由开关
    [高并发]幂等性、最终一致性
    [高并发]Beanstalkd消息中间件使用
    [高并发]Redis 集群搭建步骤
    [PHP] laravel5.5 搭建流程
    [PHP] 破Laravel白屏问题
    talk 64
    linux
    yum
    linux修改时区
  • 原文地址:https://www.cnblogs.com/qidakang/p/8965505.html
Copyright © 2020-2023  润新知