事务

来源:互联网 发布:2017淘宝违禁词有哪些 编辑:程序博客网 时间:2024/06/11 05:00
【英文】:Transaction
【定义】
    把一个或多个操作组合成逻辑上的一个操作单元。举个例子来说,A要给B转账100元。在这个操作中,包含两个操作:1、A的钱要减少100元。2、B的钱要增加100元。对于转账这个操作,不论是银行或者客户都会要求这两个操作要么都不执行,要么都执行,绝对不允许只执行其中一个。
【ACID性质】
    原子性(Atomicity):一个事务就是一个不可分割的执行单元。
    一致性(Consistency):事务执行后,仍保证数据一致。
    隔离性(Isolation):多个事务并发执行后,保证执行结果正确。
    持久性(Durability):一个事务成功执行后,结果永久保存在数据中。
【SQL Server中事务运行模式】
    自动提交事务
    显示事务
    隐式事务
    批处理级事务

                                                       (入门经典

【背景】
    做一个A给B转账的Demo,假设A的账号为1,B的账号为2。
【代码】
    这里介绍两种实现办法。
    【实现1】:
    步骤1:创建数据库和数据库
 
    
  1. --建库  
  2. IF EXISTS (SELECT name FROM sys.databases WHERE name = N'Test')  
  3.     drop database [TransTestDb]  
  4.   
  5. CREATE DATABASE [TransTestDb];  
  6. --建表  
  7. use [TransTestDb]  
  8. go  
  9. IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Test1]') AND type in (N'U'))  
  10.     drop table [Test1]  
  11.   
  12. CREATE TABLE [dbo].[Test1]
  13. (
  14.     ID int not null primary key,
  15.     moneys money
  16. ); 
  17. --初始值  
  18. use [Test1]  
  19. go  
  20. insert into Test1 values('1','100')
  21. insert into Test1 values('2','200')
    步骤2:把事务语句放到存储过程中
  1. --创建存储过程
    1. create procedureMyTest
    2. @toIDint,--接收转账的账户
    3. @fromIDint,--转出自己的账户
    4. @momeys money--转账的金额

    5. as
    6. begin tran--开始执行事务
    7. updateTest1set moneys=moneys-@momeyswhere ID=@fromID-执行的第一个操作,转账出钱,减去转出的金额
    8. updateTest1set moneys=moneys+@momeyswhere ID=@toID--执行第二个操作,接受转账的金额,增加

    9. if@@error<>0--判断如果两条语句有任何一条出现错误
    10. begin rollback tran–开始执行事务的回滚,恢复的转账开始之前状态
    11. return0
    12. end
    13. else--如何两条都执行成功
    14. begin commit tran执行这个事务的操作
    15. return1
    16. end
    17. go

    步骤3:C#.Net调用存储过程
    
[csharp] view plain copy
 print?
  1. private void button1_Click(object sender, EventArgs e)  
  2. {  
  3.     SqlConnection conn = new SqlConnection(@"server=.;database=Test;uid=sa;pwd=123456");  
  4.     SqlCommand cmd=new SqlCommand("MyTest",conn );  
  5.     cmd.CommandType =CommandType.StoredProcedure ;  
  6.     conn.Open();  
  7.   
  8.     cmd.Parameters .AddWithValue("@fromID",1);  
  9.     cmd.Parameters .AddWithValue ("@toID",2);  
  10.     cmd.Parameters .AddWithValue ("@moneys",Convert.ToInt32(textBox1.Text ));  
  11.     cmd.Parameters .AddWithValue ("@return","").Direction =ParameterDirection .ReturnValue ;  
  12.     cmd.ExecuteNonQuery() ;  
  13.     string value =cmd.Parameters["@return"].Value .ToString();  
  14.   
  15.   
  16.     if(value=="1")  
  17.     {  
  18.         label1.Text ="转账成功!";  
  19.     }  
  20.     else  
  21.     {  
  22.         label1.Text ="转账失败!";  
  23.     }  
  24. }  
       【实现2】:
[csharp] view plain copy
 print?
  1. private void button2_Click(object sender, EventArgs e)  
  2. {  
  3.     SqlConnection conn = new SqlConnection(@"server=.;database=Test;uid=sa;pwd=123456");  
  4.     conn.Open();  
  5.     SqlTransaction tran = conn.BeginTransaction();  
  6.     SqlCommand cmd = new SqlCommand();  
  7.     cmd.Connection = conn;  
  8.     cmd.Transaction = tran;  
  9.     try  
  10.     {  
  11.         cmd.CommandText  = "update Test1 set moneys=moneys-" + Convert.ToInt32(textBox1 .Text ) + " where ID='1'";  
  12.         cmd.ExecuteNonQuery();  
  13.         cmd.CommandText = "update Test1 set moneys=moneys+" + Convert.ToInt32(textBox1.Text) + "where ID ='0'";  
  14.         cmd.ExecuteNonQuery();  
  15.         cmd.CommandText = "insert into Test1 values('jsljf','sfsf')";  
  16.         cmd.ExecuteNonQuery();  
  17.         tran.Commit();  
  18.         label1.Text = "转账成功!";  
  19.     }  
  20.     catch   
  21.    {  
  22.        label1.Text = "转账失败!";  
  23.        tran.Rollback();  
原创粉丝点击