热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

再看数据库(4)事务

什么是事务?简单的说,就是你要做的或所做的事情。用术语表述是指访问并可能更新数据库中各种数据项的一个程序执行单元。在数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。举个很经典的例子:从A账户向B账户转账。这个过程需要完成两个步

什么是事务?简单的说,就是你要做的或所做的事情。用术语表述是指访问并可能更新数据库中各种数据项的一个程序执行单元。 在数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。 举个很经典的例子:从A账户向B账户转账。这个过程需要完成两个步

什么是事务?简单的说,就是你要做的或所做的事情。用术语表述是指访问并可能更新数据库中各种数据项的一个程序执行单元。

在数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

举个很经典的例子:从A账户向B账户转账。这个过程需要完成两个步骤:1)从A账户中减去钱;2)在B账户中加上相应的钱数。很简单,这两个步骤缺一不可。如果一旦出错,后果不堪设想。怎么办呢?这就引出了事务的用处。

sql语句如下,当不出错时,提交事务转账成功。如果出错了,就执行回滚。数据库设计也很简单,一张money表,两个字段bankName(账户名)和totalMoney(总资产)。

begin try
	begin   tran   --开始事务   
		update money set totalMOney=totalMoney-100 where bankName='A' --A账户减100   
		update money set totalMOney=totalMoney+100 where bankName='B'--B账户加100
	commit  tran  --提交事务    
End try
begin catch
	rollback tran  --事务回滚
end catch
还以转账为例,从A向B转账。

\

具体代码如下:

 private void button1_Click(object sender, EventArgs e)
        {
            SqlTransaction sqlTrans = null;
            SqlConnection con = new SqlConnection("server=.;database=bank;uid=sa;pwd=123456;");

            try
            {
                con.Open();
                //开始事务
                sqlTrans = con.BeginTransaction();
                SqlCommand cmd = new SqlCommand("", con, sqlTrans);
                cmd.CommandTimeout = 120;
                cmd.CommandType = System.Data.CommandType.Text;

                string cutA = "update money set totalMOney=totalMoney-@count where bankName='A'";
                string addB = "update money set totalMOney=totalMoney+@count where bankName='B'";

                //给参数赋值
                SqlParameter paras = new SqlParameter("@count", txtMoney.Text);

                cmd.Parameters.Add(paras);
                
                cmd.CommandText = cutA;
                cmd.ExecuteNonQuery();

                cmd.CommandText = addB;
                cmd.ExecuteNonQuery();
                //throw new Exception("test exception.the transaction must rollback");  用以测试事务回滚

                //提交事务
                sqlTrans.Commit();


            }
            catch (Exception ex)
            {
                //事务回滚
                sqlTrans.Rollback();
                Console.Write(ex.Message);
            }
            finally
            {
                if (con.State != System.Data.ConnectionState.Closed)
                    con.Close();
            }

            Console.ReadLine();
        }
现在看一下事务回滚时的情况:将上面注视掉的一行代码恢复正常,再次运行。减少A账户钱和增加B账户的钱,两个操作都没有执行,这样虽然即使出错了,也不会造成更严重的后果,只是让程序恢复到执行前的状态。

看了上面的例子,就能跟好的理解事务的属性了,分别有原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
1)atomicity 原子性。这说明事务是一个不可分割的工作单位,事务中包括的所有操作要么都做,要么都不做。这也是核心之处。

2)consistency 一致性。事务必须是使数据库从一个一致性状态变到另一个一致性状态。这一点和原子性很像。

3)isolation 隔离性。一个事务的执行不能被其他事务干扰。
4)durability 持久性。指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。若转账成功,就将数据更新到数据库。

感想:事务,这个名词很早就听说过了。之所以到现在才去了解它实践它,是因为感觉它很难。以至于遇到类似的内容总是绕着走开,也错过了很多学习的机会。越早了解,就有越多动手实践的机会。


推荐阅读
  • 本文详细介绍了如何使用libpq库与PostgreSQL后端建立连接。通过探讨PQconnectdb()函数的工作原理及其在实际应用中的使用方法,帮助读者理解并掌握建立高效、稳定的数据库连接的关键步骤。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 在使用SQL Server进行动态SQL查询时,如果遇到LIKE语句无法正确返回预期结果的情况,通常是因为参数传递方式不当。本文将详细探讨这一问题,并提供解决方案及相关的技术背景。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
author-avatar
eyk0256912
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有