再看数据库——(4)事务

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

在数据库中,一个事务可以是一条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 [email protected] where bankName='A'";
                string addB = "update money set [email protected] 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 持久性。指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。若转账成功,就将数据更新到数据库。

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

时间: 2024-08-24 03:39:43

再看数据库——(4)事务的相关文章

机房收费系统合作——再看数据库设计

机房合作我负责了最简单的D层,接口层,工厂层.反正D层是我来写,于是数据库索性也就顺便设计了.已经是第三次敲机房收费系统了,每次都是相隔半年左右吧.需求搞得透透的了,数据库也就好设计了.基本跟第二次没什么大的区别,就是把Student表和Card表分开了. 重构的时候,我的数据库几乎什么都用到了:事务,存储过程,触发器,视图,联合查询等等.所以,这次设计数据库还是SO Easy的..并且,为了让婵婵和牛迁迁师哥写的方便,我把组合查询都写成了存储过程!!!!费了一番功夫,但是D层简单了不少.还记得

再看数据库——(2)视图

概念 *是从用户使用数据库的观点来说的. *从一个或多个表(视图)中导出来的 *一个虚表,或者说查询表 为什么要用视图呢? 一是简单,看到的就是需要的.视图不仅可以简化用户对数据的理解,也可以简化他们的操作.那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件. 二是 安全,通过视图用户只能查询和修改他们所能见到的数据,但不能授权到数据库特定行和特定的列上.通过视图,用户可以被限制在数据的不同子集上:使用权限可被限制在另一视图的一个子集上,或是一些视图和基表合并后

再看数据库——(1)存储过程

当我们执行一个比较简单的操作时,一般都是用SQL语句.但是当逻辑越来越复杂时,仅仅使用顺序执行的SQL语句序列表现出很大的局限性.这时,就可以考虑用另一种方法了,那就是存储过程. 现在数据库系统往往采用客户机/服务器计算模式,很多工作可以在客户端完成,也可以在服务器端完成.客户机/服务器系统与传统的数据库系统的一个很重要的区别是,在传统的数据库系统中只存放数据,所有的应用程序都在用户端,都与用户实际运行的应用程序捆绑在一起:而客户机/服务器系统中,在数据库中还存放程序,由于这种程序以数据库对象的

再看数据库——(7)游标

背景: 其实<再看数据库>系列博客本没有计划写这么多,但最近确实接触数据库比较多,又接触了这些东西,在之前很少用到,因此就整理下,和大家分享. 简介: 游标,是一个数据缓冲区,用来存放SQL语句的执行结果.与一般的执行过程不同的是,游标是从结果集中每次提取一条记录. 与关系数据库的区别: 关系数据库--面向集合,一般执行结果都是一个集合,如果要选择其中一条或几条记录,就要用where子句. 游标     --面向单条记录.游标可以对查询语句返回的结果集中的每一行进行相同或不同的操作. 因此说,

再看数据库——(3)触发器

概念: 触发器,顾名思义,它是由事件来触发的.比如当我们对表进行操作时就会激活它执行. 说到触发器,还要提一个关键点,那就是"保持数据完整性".什么意思呢?比如业务需求是,当我们注销一个卡号时,把该卡的充值.上机等信息也一并删除.这时如果是一个一个操作执行,就会是:注销卡--删除卡的充值信息--删除卡的上机信息(两个删除操作不分先后).这样做的弊端是,我们很容易把其中的一个步骤遗漏了,业务也不完整.用了触发器以后,当我们注销卡时激活触发器执行删除操作. 用触发器的好处就是很大程度上有利

再看数据库——(6)连接

简单介绍: 连接是多表查询的基础. 因为关系数据库不包括指针或其它关联记录与记录的机制,连接成为了生成跨表数据关系的唯一机制. 这也就是要用连接的原因. 分类: 1.内连接 使用比較运算符比較被连接列的列值. 等值--"=" 不等--"="以外运算符 自然--"=",但它使用选择列表指出查询结果集合中所包含的列.并删除连接表中的反复列. 演示样例: 数据库中的两张表分别为dbo.Staff和dbo.Province. 注:dbo.Staff表中的

再看Cassandra 之NOSQL 数据库

Cassandra或许不会因为是NoSQL而得到关注,但是它在完成某些特定工作上,有迷人的魅力,这Netflix和Instagram两家公司一定知道. 过去的这些年,NoSQL的参与者,例如MongoDB已经得到了快速发展,受到了非常多的关注,但是 Apache Cassandra的光环褪去,作为创造了Cassandra的Facebook已经放弃了它,Cassandra的社区也好像过时了快.但 是Cassandra的命运迎来的转机,Netflix近来决心把他们自己的数据中心的oracle改成Ca

数据库并发事务控制四:postgresql数据库的锁机制二:表锁

在博文<数据库并发事务控制四:postgresql数据库的锁机制 > http://blog.csdn.net/beiigang/article/details/43302947 中后面提到: 常规锁机制可以参考pg的官方手册,章节和内容见下面 13.3. Explicit Locking http://www.postgresql.org/docs/9.4/static/explicit-locking.html 这节分为:表锁.行锁.页锁.死锁.Advisory锁(这个名字怎么翻译好???

数据库的事务

数据库事务:事务是数据库运行中的一个逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理. 以下内容部分介绍转自用户fjdingsd: 数据库支持事务的操作的数据库特性(ACID): ⑴ 原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一