ADO.NET笔记——执行事务

相关知识:

  1. 处于同一事务(Transaction)内的一组操作,要么都成功执行,最后完全提交;但如果只要有任何一个操作失败或者出问题,所有值钱执行的操作也都取消并恢复到初始状态(即回滚)
  2. SqlTransacttion代表从ADO.NET中发出的事务

代码示例:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data;
 7 using System.Data.SqlClient;
 8
 9 namespace ConsoleApplication13
10 {
11     class Program
12     {
13         static string strConn = @"server=Joe-PC;database=AccountDBforSQLInjection;uid=sa;pwd=root";
14         static SqlConnection conn = new SqlConnection(strConn);
15
16         static string sql1 = "INSERT INTO Account(AccountID,AccountName,password) VALUES"
17             + "(100,‘sql1‘,‘123456‘)";//此命令正确
18         static string sql2 = "INSERT INTO Account(AccountID,AccountName1,password) VALUES"
19             + "(100,‘sql2‘,‘123456‘)";//此命令因有拼写错误将会失败
20
21         static SqlCommand cmd1 = new SqlCommand(sql1, conn);
22         static SqlCommand cmd2 = new SqlCommand(sql2, conn);
23
24         static void Main(string[] args)
25         {
26             //OperationWithoutTransaction();
27             OperationWithTransaction();
28         }
29
30         static void OperationWithoutTransaction()
31         {
32             conn.Open();
33
34             try
35             {
36                 cmd1.ExecuteNonQuery();
37                 cmd2.ExecuteNonQuery();
38             }
39             catch (Exception e)
40             {
41                 Console.WriteLine("执行失败。");
42                 Console.WriteLine(e);
43             }
44             finally
45             {
46                 conn.Close();
47             }
48         }
49
50         static void OperationWithTransaction()
51         {
52             conn.Open();
53             //连接打开后,才能启动事务
54             SqlTransaction trans = conn.BeginTransaction();
55             //将两个操作添加到同一个事务中
56             cmd1.Transaction = trans;
57             cmd2.Transaction = trans;
58
59             try
60             {
61                 cmd1.ExecuteNonQuery();
62                 cmd2.ExecuteNonQuery();
63                 //如果没有出现异常,则提交事务
64                 trans.Commit();
65             }
66             catch (Exception e)
67             {
68                 Console.WriteLine("执行失败,事务回滚。");
69                 Console.WriteLine(e);
70                 //执行回滚
71                 trans.Rollback();
72             }
73             finally
74             {
75                 conn.Close();
76             }
77         }
78     }
79 }

程序分析:

  1. 没有使用事务时,如果命令1执行正确,而命令2执行错误,则命令1的修改将成功保存到数据库中
  2. 使用事务之后,只要有任何一个命令错误,则另个命令都不会对数据库造成影响
时间: 2024-09-30 19:05:00

ADO.NET笔记——执行事务的相关文章

.NET开发中的事务处理---ADO.NET级别的事务

现在我们对事务的概念和原理都有所了解了,并且作为已经有一些基础的C#开发者,我们已经熟知编写数据库交互程序的一些要点,即: (1)使用SqlConnection类的对象的Open()方法建立与数据库服务器的连接. (2)然后将该连接赋给SqlCommand对象的Connection属性. (3)将欲执行的SQL语句赋给SqlCommand的CommandText属性. (4)通过SqlCommand对象进行数据库操作. 创建一个ADO.NET事务是很简单的,需要定义一个SqlTransactio

Hibernate学习笔记_事务

 事务并发处理(面试的意义更大)                        a)   事务:ACID i.   Atomic(原子性) Consistency(一致性) Isolation(隔离性) Durability(独立性) b)   事务并发时可能出现的问题: 第一类丢失更新(Lost Update) 时间 取款事务A 存款事务B T1 开始事务   T2   开始事务 T3 查询账户余额为1000元   T4   查询账户余额为1000元 T5   汇入100元把余额改为1100元

SqlServer批量刷数据执行事务回滚语句备份

企业进行对数据库执行刷数据工作,一段很长的语句希望同时成功或者失败时用到. 1.建立测试环境 /************************************************************ * Code formatted by SoftTree SQL Assistant ?v6.5.278 * Time: 2016/9/29 21:33:55 ************************************************************/

Redis学习笔记(7)-事务

package cn.com; import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; public class Redis_Transactions { public static Jedis redis = new Jedis("localhost", 6379);// 连接redis /** * 基本事务用法 * 默认给user1,user2都

读书笔记 SQL 事务理解

事务的ACID属性 Atomicity 原子性 每个事务作为原子单元工作(即不可以再拆分),也就是说所有数据库变动事务,要么成功要么不成功. SQL Server把每个DML或者 DDL命令都当做一个事务.不允许任何命令只是部分成功. 比如一个UPDATE语句更新500行,除非500行全部更新,否则有任何情况阻止该命令更新.SQL Server会终止该命令更新,并且回滚事务. Consistency 一致性 每个事务,不论成功或失败,数据库中定义的约束状态必须一致,否则会回滚. 比方说一个事务企

Redis笔记3-redis事务

Redis的事务机制允许同时执行多条指令,它是原子性操作,事务中的命令要么全部执行,要么全部不执行,另外,事务中的所有指令都会被序列化,而且其开始执行过程中,不回被即时过来的指令所打断,其需要经历三个过程,分别为开始事务.命令入队以及执行事务. 一.相关命令 1.MULTI 该命令用来开启事务,它总是返回ok结果,当其执行之后,客户端可以继续发送任意条数量的指令,这些指令不会立即被执行,而是被放到了队列中,直到EXEC被调用之后,所有命令才会被序列化执行. 2.EXEC 该命令负责触发并执行队列

ADO.NET笔记——使用DataAdapter执行增删改操作

相关知识: DataSet中的数据一旦从数据库下载下来,便不再与数据库保持联系.如果修改了DataSet中的数据,需要重新建立连接,并且通过SQL命令将修改更新到数据库去 编写SQL命令往往比较繁琐和机械化,ADO.NET提供了一个SqlCommandBuilder对象,帮助DataAdapter对象从SELECT语句推算出需要的UPDATE,DELETE和INSERT语句:然后DataAdapter便可以利用这些语句,检查DataSet中被修改的数据,然后提交到数据库 SqlCommandBu

Spring学习笔记——Spring事务仅仅对执行时异常回滚

我们在使用Spring时候一般都知道事务在遇到异常的时候会回滚.岂不知Spring的事务默认仅仅有在发生执行时异常即:RunTimeException时才会发生事务,假设一个方法抛出Exception或者Checked异常Spring的事务并不会回滚. 以下我们来看看异常的分类.异常一般分为Checked异常和RunTime异常. CheckedException: Java觉得Checked异常都是能够被处理的异常,所以Java程序必须显式的处理Checked异常,假设程序没有处理checke

JDBC学习笔记(7)——事务的隔离级别&批量处理

数据库事务的隔离级别 对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段,