none
写好了事物,为什么还是有其中一句执行,一句不执行 RRS feed

  • 问题

  • 数据库里没有update第二条姓名=‘李健’,应该两条都不执行,为什么第一句姓名=‘吴杰’的仍然执行?

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace SqlTransaction1
    {
        class Program
        {
            public void update()
            {
                string constr = @"server=.\SQLSERVER2017;database=alex;uid=sa;pwd=XXXXX";
                string update = "update Score set 语文成绩=88 where 姓名='吴杰';";
                update += "update Score set 语文成绩=88 where 姓名='李健';";
                SqlTransaction tran=null;
                using (SqlConnection conn = new SqlConnection(constr))
                {
                    try
                    {
                        conn.Open();
                        tran = conn.BeginTransaction();
                        SqlCommand cmd = new SqlCommand(update, conn);
                        cmd.Transaction = tran;
                        cmd.ExecuteNonQuery();
                        tran.Commit();
                    }
                    catch
                    {
                       
                        tran.Rollback();
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
           //static  string constr = @"server=.\SQLSERVER2017;database=alex;uid=sa;pwd=alex1993";
           //static  SqlTransaction tran = null;
          
            static void Main(string[] args)
            {
                Program p = new Program();
                p.update();
            }
    
            }
        }

    2018年6月5日 23:47

答案

  • 你好,

    根据你的代码,只有在程序抛exception 的时候,才会执行回滚, 而你的这段代码,是可以正常执行的,并不会抛exception, 所以事务不会回滚。

    你如果想实现记录不存在就实现回滚,我建议你先做查询,检查有没有记录,如果没有就不执行Update 方法。

    Best regards,

    Zhanglong


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 金灶沐 2018年6月10日 11:47
    2018年6月8日 6:02
    版主

全部回复

  • 不是事务的原因,2个sql command要分2次执行

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (SqlCommand command1 = new SqlCommand(commandText1, connection))
        {
        }
        using (SqlCommand command2 = new SqlCommand(commandText2, connection))
        {
        }
        // etc
    }

    或是

    // Create the first command and execute
    var command = new SqlCommand("<SQL Command>", myConnection);
    var reader = command.ExecuteReader();
    
    // Change the SQL Command and execute
    command.CommandText = "<New SQL Command>";
    command.ExecuteNonQuery();


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2018年6月6日 0:15
  • 分开写还是不行啊,根本没有李健yi这个人,但是吴杰的语文成绩还是跟新了,我的事物代码哪边有问题吗?

      try
                    {
                        conn.Open();
                        tran = conn.BeginTransaction();
                        //SqlCommand cmd = new SqlCommand(update, conn);
                        //cmd.Transaction = tran;
                        //cmd.ExecuteNonQuery();
                        //tran.Commit();
                        SqlCommand cmd = new SqlCommand("update Score set 语文成绩 = 62 where 姓名 = '吴杰'",conn);
                        cmd.Transaction = tran;
                        cmd.ExecuteNonQuery();
                        SqlCommand cmd2 = new SqlCommand("update Score set 语文成绩=62 where 姓名='李健yi';", conn);
                        cmd2.Transaction = tran;
                        cmd2.ExecuteNonQuery();
                       
                        tran.Commit();
                    }
                    catch
                    {
                       
                        tran.Rollback();
    
                    }

    2018年6月6日 23:39
  • SQL Profiler 跟一下,看传到SQL Server中去的SQL语句是什么

    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2018年6月7日 0:21
  • update Score set 语文成绩 = 62 where 姓名 =N '吴杰'

    unicode前要加N

    “没有李健yi这个人”,那Update语句不符合条件,它只是没有更新数据,但查询引擎会执行。

    您用SQL Profiler看一下,它是否传递到SQL Server中


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2018年6月7日 0:24
  • 你好,

    根据你的代码,只有在程序抛exception 的时候,才会执行回滚, 而你的这段代码,是可以正常执行的,并不会抛exception, 所以事务不会回滚。

    你如果想实现记录不存在就实现回滚,我建议你先做查询,检查有没有记录,如果没有就不执行Update 方法。

    Best regards,

    Zhanglong


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 金灶沐 2018年6月10日 11:47
    2018年6月8日 6:02
    版主