数据库事务、存储过程、函数以及触发器之间的区别和联系

作者&投稿:偶呢 (若有异议请与网页底部的电邮联系)
~

数据库事务、存储过程、函数以及触发器之间的区别和联系如下:

一、事务概念

事务(Transaction)是指构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行。

1、如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态(要么全执行,要么全都不执行)。

2、同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。

二、事务举例

用一个常用的“A账户向B账户汇钱”的例子来说明如何通过数据库事务保证数据的准确性和完整性。熟悉关系型数据库事务的都知道从账户A到账户B需要6个操作,分别为:

1、从A账户中把余额读出来(500)。

2、对A账户做减法操作(500-100)。

3、把结果写回A账户中(400)。

4、从B账户中把余额读出来(500)。

5、对B账户做加法操作(500+100)。

6、把结果写回B账户中(600)。

三、事务特性

并非任意的对数据库的操作序列都是数据库事务,事务应该具有4个属性,分别为:原子性、一致性、隔离性和持久性。这四个属性通常称为ACID特性。

1、原子性(Atomicity):一个事务对数据库的所有操作,是一个不可分割的工作单元,这些操作要么全部被执行,要么都不执行;保证1-6所有过程要么都执行,要么都不执行。一旦在执行某一步骤的过程中发生问题,就需要执行回滚操作。假如执行到第5步的时候,B账户突然不可用(比如被注销),那么之前的所有操作都应该回滚到执行事务之前的状态。

2、一致性(Consistency):事务应确保数据库的状态从一个一致状态转为另一个一致状态,一致状态的含义是数据库中的数据应满足完整性约束;在转账之前,A和B的账户中共有500+500=1000元钱。在转账之后,A和B的账户中也应该共有400+600=1000元钱。

也就是说,数据的状态在执行该事务操作之后从一个状态改变到了另外一个状态,同时一致性还能保证账户余额不会变成负数等。

注:一致性与原子性是密切相关的,原子性的破坏可能导致数据库的不一致,数据的一致性问题并不都和原子性有关。

比如上面的例子,在第5步的时候,对B账户做加法时只加了50元。那么,该过程可以符合原子性,但是数据的一致性就出现了问题。因此,事务的原子性与一致性缺一不可。

3、隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行;在 A向B转账的整个过程中,只要事务还没有提交(commit),查询A账户和B账户的时候,两个账户里面的钱的数量都不会有变化。

如果在A给B转账的同时,有另外一个事务执行了C给B转账的操作,那么当两个事务都结束的时候,B账户里面的钱应该是A转给B的钱加上C转给B的钱再加上自己原有的钱。

4、持久性(Durability):一个事务一旦提交,它对数据库的修改应该永久保存在数据库中。

例如我们在数据库,用update语句更新某条记录时,会默认开启一个数据库事务,当我们执行(F8)这条语句后,再次查询这条记录,已经被更新,但没有提交事务,事务并没有对数据库产生影响。此时如果关闭查询窗口(出现故障),并未对数据库记录产生影响,只有将事务提交之后,这条记录才会真正并永久的更新。

四、事务并发

事务并发:一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库,数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题,破坏数据的完整性。

并发问题归结:数据问题(脏读、幻读、不可重复读)、数据更新问题(更新丢失)。

一、存储过程的概念

①存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。

②存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(可以有参数,也可以没有)来执行它。

③存储过程是流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中。

④存储过程,可由应用程序通过一个调用来执行,而且允许用户声明变量。

⑤同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。

二、存储过程的优点

①存储过程的使用大大增强了SQL语言的功能和灵活性。

存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

②可保证数据的安全性和完整性。

通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性,(就像事务的原子性:要么事务内的所有SQL语句全部执行成功,要么全部不成功)。

③在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成(因为已经提前经过编译),所以存储过程能以极快的速度执行。

④可以降低网络的通信量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语句相比自然数据量少了很多(在远程访问时体现出来)。

⑤存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

⑥当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来,与数据库提供的事务处理结合一起使用。比如每一步对数据库的操作用一个事务来完成,把这些事务全都放在一个存储过程中。

⑦存储过程可以重复使用,可减少数据库开发人员的工作量。

⑧安全性高,可设定只有某些用户才具有对指定存储过程的使用权。

三、存储过程缺点

①调试麻烦:但是用PL/SQL Developer调试很方便,弥补这个缺点。

②移植问题:数据库端代码当然是与数据库相关的,但是如果是做工程型项目,基本不存在移植问题。

③重新编译问题:因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。比如A存储过程调用B存储过程,使用B的返回值作为参数,如果B的参数或返回值发生改变时,会对调用她的A产生影响,此时存储过程就要重新编译,设置成运行时刻自动编译。

④维护比较困难:如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

四、存储过程的种类

①系统存储过程:一般以“sp_”开头,用来进行系统的各项设定,获取配置信息,相关管理工作。

②本地存储过程:用户创建的存储过程,是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。

③临时存储过程:分为两种存储过程。

一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它。

二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。

④远程存储过程:在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令(在SQL*Plus命令行窗口中)执行一个远程存储过程。

⑤扩展存储过程:扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。

五、存储过程的特性

1、存储过程与函数的区别

①返回值:函数只能返回一个变量,而存储过程可以返回多个,对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。

②存储过程一般是作为一个独立的部分来执行(EXECUTE语句执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。SQL语句中不可用存储过程,而可以使用函数。

③存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强,比较单一。

2、存储过程与事务的区别

①存储位置:事务在程序中被调用,保存在调用以及实现它的代码中,存储过程可以在数据库客户端直接被调用,经编译后存储在数据库中。

②运行方式:事务在每次被调用的时候执行其中的SQL语句,存储过程预先经过编译,并不是每次被调用时都会执行一遍其中的SQL语句。

③事务有严格的一致性和原子性,使用的安全性高,存储过程则没有这些特性,在进行一些复杂的操作时,为了保证操作的准确性,可以在存储过程中调用事务,然后判断事务的执行结果是否成功来确保操作的准确性。

3、触发器

①概念及作用

触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如Update、Insert、Delete这些操作时,SQL Server就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。

触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:

(1)强化约束(Enforce restriction)触发器能够实现比CHECK语句更为复杂的约束。

(2)跟踪变化(Auditing changes)触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。

(3)级联运行(Cascaded operation)触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。

(4)存储过程的调用(Stored procedure invocation)为了响应数据库更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS(数据库管理系统)本身之外进行操作。

由此可见,触发器可以解决高级形式的业务规则或复杂行为限制,以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理,此外一个表的同一类(Insert、Update、Delete)的多个触发器能够对同一种数据操作采取多种不同的处理。

总体而言,触发器性能通常比较低,当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中,可见触发器所参照的其它表的位置决定了操作要花费的时间长短。




现代移动通信技术的发展趋势
类型业务是理想的,如信用卡认证、远程测量和远程事务处理。EDGE(增强数据速率GSM改进模式)使用修改过的...系统,在此演进过程中,移动网络所能实现的数据速率逐步升级;GSM承载业务所能提供的数据速率为9.6Kb\/s,...数据库,进而进一步建立集中的业务管理系统和业务生成环境来达到上述目标。通过智能网,运营公司可以最优地...

股票交易的具体流程是什么?
这样,整个开立股票帐户的过程即告完成。 开立资金帐户的程序 投资者开立股票帐户以后,尚不能进行股票...上交所设立证券集中保管库,各券商在上交所分别建立证券库存分帐户。在办理证券交割时,由上交所提供证券...交割是指投资者与受托券商就成交的买卖办理款项与股票结算事务的手续。投资者在股票买卖的次日,即可到受托...

谁能帮我找写一篇会计学专科社会调查报告。
特别是我国加入WTO后,大量具有挑战性的外国事务所和复合型人才的涌入,使我国的会计服务业接受着严峻的...并不熟练利用计算机信息系统处理企业的经济业务具有数据处理过程自动化,数据存储磁性化,内部控制程序化等...这些新事物将不可避免的使会计人员的知识库面临严重的冲击,因此若想对这些新事物理解、掌握,开展对...

有关CPU、内存、硬盘、主板的参数
然而,这个参数对系统性能的影响并不大,因为程序存储数据到内存中是一个持续的过程。在同个程序中一般...这样可以得到更大的内存带宽,在处理大量数据时就能明显的从中获益,例如数据库操作,Photoshop等。 另外...具备写缓存的硬盘则在数据写入缓区后即向主机报告写入完毕,让主机提前“解放”处理其他事务(剩下的...

《名侦探柯南》中有谁知道工藤新一的真实身份?他们是在多少集里发现的...
TV128黑暗组织10亿元抢劫事件,已死)10.Irish (真实身份未知,已死亡,见剧场版13 漆黑的追踪者,根据指纹对照证实)11.泽田弘树(见剧场版06《贝克街的亡灵》,但有争议:泽田弘树死后的思想存储在了计算机里,因此有人说是计算机的分析得出了柯南就是工藤新一的结论)12.鲁邦三世那一伙人 ...

mysql和access的区别是什么?
2、资料处理能力不同:MySQL的资料处理能力比Access强;MySQL如果处理100MB的档案,不会发生承载过重的迹象,而Access处理100MB档案就会造成网站效率低下。3、结构优化条件不同:MySQL仅需优化硬件条件,而不是MySQL本身,本身其效率不如Access;Access的数据库非常的有效率,当然这也有赖于网站的结构设计;...

NTFS硬盘是什么意思?
NTFS硬盘说明这个硬盘的文件系统为NTFS格式。NTFS是一个可恢复的文件系统。在NTFS分区上用户很少需要运行磁盘修复程序。NTFS通过使用标准的事务处理日志和恢复技术来保证分区的一致性。发生系统失败事件时,NTFS使用日志文件和检查点信息自动恢复文件系统的一致性。NTFS可以支持的分区(如果采用动态磁盘则称为卷)...

请教有关破坏计算机系统信息罪和有关非法入侵计算机罪
破坏计算机信息系统罪,是指违反国家规定,对计算机信息系统功能或计算机信息系统中存储、处理或者传输的数据和应用程序进行破坏,或者故意制作、传播计算机病毒等破坏性程序,影响计算机系统正常运行,后果严重的行为。违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的行为。现在,假设P1进入了某台计算机,...

零基础学Python应该学习哪些入门知识
3.2.1 利用好搜索引擎。3.2.2 求助于各大网站。推荐 stackoverflow:这是一个程序员的知识库;v2ex:国内非常不错的编程社区,不仅仅是包含程序,也包含了程序员的生活;segmentfault:一家以编程问答为主的网站;CSDN、知乎、简书等 3.2.3 加入相关的QQ、微信群、百度知道。不懂的可以随时请教。

软件和硬件的区别是什么?
一、软件是一种逻辑的产品,与硬件产品有本质的区别 硬件是看得见、摸得着的物理部件或设备。在研制硬件产品时,人的创造性活动表现在把原材料转变成有形的物理产品。而软件产品是以程序和文档的形式存在,通过在计算机上运行来体现他的作用。在研制软件产品的过程中,人们的生产活动表现在要创造性地抽象...

临清市13731963436: 数据库存储过程、函数、触发器的区别 -
梁王婴儿: 存储过程和函数的区别:1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强.2. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象.3. 存储过程一般是作为一个独立的部分来执行,而函数可以作...

临清市13731963436: SQL中存储过程与触发器的区别? -
梁王婴儿: 存储过程与触发器是SQL Server 中的两类数据库对象.它们都是由T-SQL语句编写而成的过程,所不同的是存储过程是由用户根据需要调用执行的,而触发器则是由某个动作(如删除或修改一条记录)引发执行的.另外,存储过程可以不依附于一个特定的表.它们与函数也不同,函数可以直接通过函数名返回数值,其返回值可以直接在表达式中使用,而存储过程与触发器则不能直接通过其名称带回返回值,也不能直接在表达式中使用!

临清市13731963436: Oracle 存储过程 触发器用法 -
梁王婴儿: 1:什么叫存储过程?在oracle中,可以在数据库中定义子程序,这种程序块叫存储过程(procedure),它存放在数据字典中,可以在不同用户和应用程序中共享,并可以实现程序的优化和重用.2:存储过程的有点? 过程运行在服务器端,...

临清市13731963436: 数据库中drop和delete的区别 -
梁王婴儿: 数据库中drop和delete的区别为:删除不同、操作不同、操作对象不同. 一、删除不同 1、drop:drop主要用于删除数据结构,包括内部的数据内容. 2、delete:delete主要用于删除数据内容,不删除数据结构. 二、操作不同 1、drop:drop操作不放到rollbacksegment中,不能回滚,操作不触发trigger. 2、delete:delete操作会放到rollbacksegement中,在事务提交后生效,执行时触发相应的trigger. 三、操作对象不同 1、drop:drop的操作对象可以是数据库,也可以是数据库中的数据表. 2、delete:delete的操作对象只能是数据库中的数据表.

临清市13731963436: sql server中触发器和存储过程的概念和作用,能不能写的明白一点,易懂一点? -
梁王婴儿: 1,触发器.其实也是一些sql语句.可以设定什么时候触发这些sql语句执行.比如,当数据库里有插入insert,update等动作的时候,让触发器的sql语句执行,这些sql语句可以插入,修改某个表.2,存储过程.也是一些sql语句集合,包含表达式,控制流程,比较接近程序语言了,比如,有if判断语句,可以声明变量,可以初始化变量,可以接受参数.

临清市13731963436: 存储过程和函数的区别是什么?触发器有什么优缺点? -
梁王婴儿: 数据库中函数相当于计算机语言里的系统函数,存储过程就相当于自定义函数.他们的区别不用说你也知道了?触发器是在某个特定条件下触发某事件.

临清市13731963436: SQL数据库,SQL触发气及存储过程 是什么概念 -
梁王婴儿: 存储过程,是一段用sql语句编写的程序.可以接收参数,执行,然后给出查询的结果.存储过程的好处是,在一定程度上封装了一些sql语句,便于程序重复的调用.而不用把sql语句写的到处都是,另外,因为是预先编译过的,所以效率也较普通的sql要快一些.触发器呢,是建立在表上的一种更新表的机制.有插入,更新,删除三种,比如两个表,一个订单,一个订单条目表.在删除订单之后,可以使用触发器把订单条目表关联的内容一起删除掉.出发器也是用sql语句编写的.

临清市13731963436: 在数据库中什么是储存过程,视图以及触发器? -
梁王婴儿: 存储过程就好象一个批处理文件一样,你可以在里面执行很多的SQL,来得到你最好需要的结果 ,或者说类似于一个函数,调用存储过程后,T-SQL一次执行很多命令,最终给你个结果 视图是虚拟表,比如要查询的东西在两个表里,那么可以把两个表连接成一个视图,这样就可以查询并显示两个表里的内容了,具体还分左右外连接 触发器是个特殊的存储过程,它的执行不是人工操作的,而是由某事件的发生而引发的 你明白了吧 插红旗 吼吼

临清市13731963436: SQL Server中什么时候使用存储过程?触发器?事务?视图?游标?有什么区别?帮忙举个例子? -
梁王婴儿: 存储过程: SQL比较复杂 逻辑比较多的时候用存储过程比较好.触发器: 就是给在某一张表改变后其他表也需要改变的时候 用触发器 事务:就是一次执行的新增 、修改、 删除的SQL比较多的时候 或者执行的时间比较长 或者 可能执行的SQL会出现错误的时候 就需要有事务.视图: 就是几个表关联查询而已.但是如果经常这几张表查询 那就可以考虑建一个视图.游标: 一般不到万不得已不用的.应为效率低. 游标就是循环用的.以上是我自己的一个看法.

临清市13731963436: sql存储过程解释 -
梁王婴儿: CREATE PROCEDURE dbo.AddOrder 创建存储过程AddOrder/* ( @parameter1 int = 5,---参数1,int类型,默认值是5 @parameter2 datatype OUTPUT ---参数2,datatype类型,用于返回结果) */( ---上面两个参数被注释掉了,也就是没有用了....

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网