我先说第一个:是事务的理解问题。事务并不管你的SQL语句是否正确,关系是否合理等。他只是保证你执行的语句组是同时执行的。即第一个语句到最后一个语句,同步进行。编译器只保证语句都发送成功了,并返回了结果。至于结果是错误信息,这个不负责。
使用事务的作用主要是为了防止网络或硬件等原因造成的故障(个人见解)。
举例:如银行的取款,保证钱吐出来的同时帐号余额减少。要不这边吐钱了,同时停电了,就会给有关方面造成损失。
:)希望你能明白。

解决方案 »

  1.   

    第二个,我也不熟。但我觉得是这样的。
    Dim Ts1 As New Threading.Thread(AddressOf Run)
    Dim Ts2 As New Threading.Thread(AddressOf Run)
    Dim Ts3 As New Threading.Thread(AddressOf Run)
    Dim Ts4 As New Threading.Thread(AddressOf Run)
    Dim Ts5 As New Threading.Thread(AddressOf Run)分别去执行试试。
      

  2.   

    事务就是保证多条SQL语句要么都执行要么都不执行。
    我的做法就是循环执行多条语句,出错就会滚,不出错才提交
      

  3.   

    找个C#代码转换为VB.NET代码就好了
    自己看看就理解了
      

  4.   

    If cls.ExecuteSQL(strSQL1) > 0 And cls.ExecuteSQL(strSQL2) > 0 Then 事务由你这么写的?? 
    你都单独执行了,当然1插入了,2没插! 
    你应该: 
    string sql= strSQL1 +";" + strSQL2; 
    cls.ExecuteSQL(sql); 
    在 ExecuteSQL,写事务! 开始事务,判断条件(TUREN)提交事务,false:回滚事务
      

  5.   

    Dim Ts1 As New Threading.Thread(AddressOf Run1) 
    Dim Ts2 As New Threading.Thread(AddressOf Run2) 
    Dim Ts3 As New Threading.Thread(AddressOf Run3) 
    Dim Ts4 As New Threading.Thread(AddressOf Run4) 
    Dim Ts5 As New Threading.Thread(AddressOf Run5) 
    定义 5个线程,各自运行独立函数! 或 参数 区别
      

  6.   

    第一个事务回滚可以在SqlCommand里加事务回滚
    第二个在winform里直接用Thread改控件状态是非线程安全的,要么用BackgroundWorker
    要么  Form.CheckForIllegalCrossThreadCalls = false;    using System;
        using System.ComponentModel;
        using System.Threading;
        using System.Windows.Forms;    namespace winform_线程安全与非线程安全
        {
            public class Form1 : Form
            {
                // This delegate enables asynchronous calls for setting
                // the text property on a TextBox control.
                delegate void SetTextCallback(string text);            // This thread is used to demonstrate both thread-safe and
                // unsafe ways to call a Windows Forms control.
                private Thread demoThread = null;            // This BackgroundWorker is used to demonstrate the 
                // preferred way of performing asynchronous operations.
                private BackgroundWorker backgroundWorker1;            private TextBox textBox1;
                private Button setTextUnsafeBtn;
                private Button setTextSafeBtn;
                private Button setTextBackgroundWorkerBtn;            private System.ComponentModel.IContainer components = null;            public Form1()
                {
                    InitializeComponent();
                    Form.CheckForIllegalCrossThreadCalls = false;
                }            protected override void Dispose(bool disposing)
                {
                    if (disposing && (components != null))
                    {
                        components.Dispose();
                    }
                    base.Dispose(disposing);
                }            // This event handler creates a thread that calls a 
                // Windows Forms control in an unsafe way.
                private void setTextUnsafeBtn_Click(
                    object sender,
                    EventArgs e)
                {
                    this.demoThread =
                        new Thread(new ThreadStart(this.ThreadProcUnsafe));                this.demoThread.Start();
                }            // This method is executed on the worker thread and makes
                // an unsafe call on the TextBox control.
                private void ThreadProcUnsafe()
                {
                    this.textBox1.Text = "This text was set unsafely.";
                }            // This event handler creates a thread that calls a 
                // Windows Forms control in a thread-safe way.
                private void setTextSafeBtn_Click(
                    object sender,
                    EventArgs e)
                {
                    this.demoThread =
                        new Thread(new ThreadStart(this.ThreadProcSafe));                this.demoThread.Start();
                }            // This method is executed on the worker thread and makes
                // a thread-safe call on the TextBox control.
                private void ThreadProcSafe()
                {
                    this.SetText("This text was set safely.");
                }            // This method demonstrates a pattern for making thread-safe
                // calls on a Windows Forms control. 
                //
                // If the calling thread is different from the thread that
                // created the TextBox control, this method creates a
                // SetTextCallback and calls itself asynchronously using the
                // Invoke method.
                //
                // If the calling thread is the same as the thread that created
                // the TextBox control, the Text property is set directly.             private void SetText(string text)
                {
                    // InvokeRequired required compares the thread ID of the
                    // calling thread to the thread ID of the creating thread.
                    // If these threads are different, it returns true.
                    if (this.textBox1.InvokeRequired)
                    {
                        SetTextCallback d = new SetTextCallback(SetText);
                        this.Invoke(d, new object[] { text });
                    }
                    else
                    {
                        this.textBox1.Text = text;
                    }
                }            // This event handler starts the form's 
                // BackgroundWorker by calling RunWorkerAsync.
                //
                // The Text property of the TextBox control is set
                // when the BackgroundWorker raises the RunWorkerCompleted
                // event.
                private void setTextBackgroundWorkerBtn_Click(
                    object sender,
                    EventArgs e)
                {
                    this.backgroundWorker1.RunWorkerAsync();
                }            // This event handler sets the Text property of the TextBox
                // control. It is called on the thread that created the 
                // TextBox control, so the call is thread-safe.
                //
                // BackgroundWorker is the preferred way to perform asynchronous
                // operations.            private void backgroundWorker1_RunWorkerCompleted(
                    object sender,
                    RunWorkerCompletedEventArgs e)
                {
                    this.textBox1.Text =
                        "This text was set safely by BackgroundWorker.";
                }            #region Windows Form Designer generated code            private void InitializeComponent()
                {
                    this.textBox1 = new System.Windows.Forms.TextBox();
                    this.setTextUnsafeBtn = new System.Windows.Forms.Button();
                    this.setTextSafeBtn = new System.Windows.Forms.Button();
                    this.setTextBackgroundWorkerBtn = new System.Windows.Forms.Button();
                    this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
                    this.SuspendLayout();
                    // 
                    // textBox1
                    // 
                    this.textBox1.Location = new System.Drawing.Point(12, 12);
                    this.textBox1.Name = "textBox1";
                    this.textBox1.Size = new System.Drawing.Size(240, 20);
                    this.textBox1.TabIndex = 0;
                    // 
                    // setTextUnsafeBtn
                    // 
                    this.setTextUnsafeBtn.Location = new System.Drawing.Point(15, 55);
                    this.setTextUnsafeBtn.Name = "setTextUnsafeBtn";
                    this.setTextUnsafeBtn.TabIndex = 1;
                    this.setTextUnsafeBtn.Text = "Unsafe Call";
                    this.setTextUnsafeBtn.Click += new System.EventHandler(this.setTextUnsafeBtn_Click);
                    // 
                    // setTextSafeBtn
                    // 
                    this.setTextSafeBtn.Location = new System.Drawing.Point(96, 55);
                    this.setTextSafeBtn.Name = "setTextSafeBtn";
                    this.setTextSafeBtn.TabIndex = 2;
                    this.setTextSafeBtn.Text = "Safe Call";
                    this.setTextSafeBtn.Click += new System.EventHandler(this.setTextSafeBtn_Click);
                    // 
                    // setTextBackgroundWorkerBtn
                    // 
                    this.setTextBackgroundWorkerBtn.Location = new System.Drawing.Point(177, 55);
                    this.setTextBackgroundWorkerBtn.Name = "setTextBackgroundWorkerBtn";
                    this.setTextBackgroundWorkerBtn.TabIndex = 3;
                    this.setTextBackgroundWorkerBtn.Text = "Safe BW Call";
                    this.setTextBackgroundWorkerBtn.Click += new System.EventHandler(this.setTextBackgroundWorkerBtn_Click);
                    // 
                    // backgroundWorker1
                    // 
                    this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
                    // 
                    // Form1
                    // 
                    this.ClientSize = new System.Drawing.Size(268, 96);
                    this.Controls.Add(this.setTextBackgroundWorkerBtn);
                    this.Controls.Add(this.setTextSafeBtn);
                    this.Controls.Add(this.setTextUnsafeBtn);
                    this.Controls.Add(this.textBox1);
                    this.Name = "Form1";
                    this.Text = "Form1";
                    this.ResumeLayout(false);
                    this.PerformLayout();            }            #endregion
                [STAThread]
                static void Main()
                {
                    Application.EnableVisualStyles();
                    Application.Run(new Form1());
                }        }
        }