使用事务的存储过程.

使用事务的存储过程.
使用事务的存储过程.

存储过程中的事务实现

一直以为存储过程会自动实现事务操作,其实不然。存储过程只是提供的事务操作的支持。

要实现事务操作,还得自己实现。

基本上方法有两个:

SET XACT_ABORT

指定当Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。

语法

SET XACT_ABORT { ON | OFF }

注释

当SET XACT_ABORT 为ON 时,如果Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为OFF 时,只回滚产生错误的Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受SET XACT_ABORT 的影响。

对于大多数OLE DB 提供程序(包括SQL Server),隐性或显式事务中的数据修改语句必须将XACT_ABORT 设置为ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。

SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。

例:

create proc testproc

as

SET XACT_ABORT on

begin tran

insert into tableA (field1) values ('aa')

insert into tableB (field1) values ('bb')

commit tran

SET XACT_ABORT off

begin tran

/*要实现的操作*/

commit tran

if @@error>0

rollback

例:

create proc testproc

as

begin tran

insert into tableA (field1) values ('aa')

insert into tableB (field1) values ('bb')

commit tran

if@@error>0

rollback

如果Transact-SQL 语句执行成功,则@@ERROR 系统函数返回0;如果此语句产生错误,则@@ERROR 返回错误号。每一个Transact-SQL 语句完成时,@@ERROR 的值都会改变。

因为每个Transact-SQL 语句执行完毕时,@@ERROR 都会得到一个新的值,@@ERROR 可用以下两种方法处理:

1.在Transact-SQL 语句后,马上检测或使用@@ERROR。

2.在Transact-SQL 语句完成后,马上把@@ERROR 存储到一个整型变量中。此变量的值可供以后使用。

@@ERROR 通常用于表示存储过程的成功或失败。整型变量初始化为0。完成每个Transact-SQL 语句后,都要测试@@ERROR 是否为0。如果@@ERROR 不是0,将被存储在变量中。存储过程然后在RETURN 语句中返回变量。如果过程中的Transact-SQL 语句都没有错误,变量保持为0。如果一个或多个语句生成错误,则变量包含最后的错误号。

oracle存储过程中事务的管理

1.存储过程中的commit与rollback create table A ( A VARCHAR2(46) not null, primary key (A) ) create table B ( A VARCHAR2(46) ) create table C ( A VARCHAR2(46) ) 表B中插入值 Insert into B(A) valus(‘a’); Insert into B(A) valus(‘b’); Insert into B(A) valus(‘b’); Insert into B(A) valus(‘c’); 1. create or replace procedure test as begin for v_cur in (select a from b) loop insert into c(a)values(v_cur.a) ; insert into a(a)values(v_cur.a) ; end loop; end; 执行结果:A、C表中均无记录。系统启动隐式事务,在遇到异常时自动回滚。 2. create or replace procedure test as begin for v_cur in (select a from b) loop insert into C(a)values(v_cur.a) ; end loop; end; 执行结果:C表中无记录。系统启动隐式事务,但等待提交或回滚。Commit后C表中可查询到插入的4条数据。 3 create or replace procedure test as

存储过程的作用和意义

存储过程的作用和意义 随着唐山公司开发部的成立,针对各项生产经营活动的系统支撑逐步到位,在开发过程中,数据库存储过程应用逐渐广泛,这里我来简要介绍下存储过程。 一、什么是存储过程: 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。 二、为什么要用存储过程呢? 存储过程真的那么重要吗,它到底有什么好处呢?存储过程说白了就是一堆SQL 的合并。中间加了点逻辑控制。 1.存储过程处理比较复杂的业务时比较实用。具体分为两个方面:(一)、响应时间上来说有优势:如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话,就只有一次。存储过程可以给我们带来运行效率提高的好处;(二)、从安全上使用了存储过程的系统更加稳定:程序容易出现BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。 2.数据量小的项目不用存储过程也可以正常运作。 三、那么什么时候才需要用存储过程? 存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。其优势主要体现在: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。 3.存储过程可以重复使用,可减少数据库开发人员的工作量。 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。 5.更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。 6.分布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。 一般来说,存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。 四、系统开发中存储过程使用的优势和劣势 优点如下: 1.执行效率高。 2.安全性能好。 3.对于一些场合非常容易实现需求。 缺点如下: 1.可维护性比较差。 2.可读性也差。

SqlServer存储过程的事务模式编写

SQL Server在存储过程中编写事务处理代码的三种方法 SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码。希望能够对您有所帮助。 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran 这样编写的SQL存在很大隐患。请看下面的例子: create table demo(id int not null) go begin tran insert into demo values (null) insert into demo values (2) commit tran go 执行时会出现一个违反not null 约束的错误信息,但随后又提示(1 row(s) affected)。我们执行select * from demo 后发现insert into demo values(2) 却执行成功了。这是什么原因呢? 原来SQL Server在发生runtime 错误时,默认会rollback引起错误的语句,而继续执行后续语句。 如何避免这样的问题呢? 有三种方法:

1. 在事务语句最前面加上set xact_abort on set xact_abort on begin tran update statement 1 ... update statement 2 ... delete statement 3 ... commit tran go 当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。 2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。 begin tran update statement 1 ... if@@error<>0 begin rollback tran goto labend end delete statement 2 ... if@@error<>0 begin rollback tran goto labend end commit tran labend: go 3. 在SQL Server 2005中,可利用try...catch 异常处理机制。

事务处理的过程

https://www.360docs.net/doc/d99607945.html,事务处理 一事务处理介绍 事务是这样一种机制,它确保多个SQL语句被当作单个工作单元来处理。事务具有以下的作用: * 一致性:同时进行的查询和更新彼此不会发生冲突,其他 用户不会看到发生了变化但尚未提交的数据。 * 可恢复性:一旦系统故障,数据库会自动地完全恢复未完 成的事务。 二事务与一致性 事务是完整性的单位,一个事务的执行是把数据库从一个一 致的状态转换成另一个一致的状态。因此,如果事务孤立执行时是正确的,但如果多个事务并发交错地执行,就可能相互干扰,造成数据库状态的不一致。在多用户环境中,数据库必须避免同时进行的查询和更新发生冲突。这一点是很重要的,如果正在被处理的数据能够在该处理正在运行时被另一用户的修改所改变,那么该处理结果是不明确的。 不加控制的并发存取会产生以下几种错误: 1 丢失修改(lost updates) 当多个事务并发修改一个数据时,不加控制会得出错误的结 果,一个修改会覆盖掉另一个修改。 2 读的不可重复性 当多个事务按某种时间顺序存取若干数据时,如果对并发存 取不加控制,也会产生错误。 3 脏读(DIRDY DATA),读的不一致性 4 光标带来的当前值的混乱 事务在执行过程中它在某个表上的当前查找位置是由光标表 示的。光标指向当前正处理的记录。当处理完该条记录后,则指向下一条记录。在多个事务并发执行时,某一事务的修改可能产生负作用,使与这些光标有关的事务出错。 5 未释放修改造成连锁退出 一个事务在进行修改操作的过程中可能会发生故障,这时需 要将已做的修改回退(Rollback)。如果在已进行过或已发现错误尚未复原之前允许其它事务读已做过修改(脏读),则会导致连锁退出。 6 一事务在对一表更新时,另外的事务却修改或删除此表的 定义。 数据库会为每个事务自动地设置适当级别的锁定。对于前面 讲述的问题:脏读、未释放修改造成的连锁退出、一事务在对一表更新时另外的事务却修改或删除此表的定义,数据库都会自动解决。而另外的三个问题则需要在编程过程中人为地定义事务或加锁来解决。 三事务和恢复 数据库本身肩负着管理事务的责任。事务是最小的逻辑工作

Oracle 存储过程中的事务处理

Oracle存储过程中的事务处理 当在SQL*Plus中进行操作时,用户可以使用COMMIT语句将在事务中的所有操作“保存”到数据库中。如果用户需要撤销所有的操作,则可以使用ROLLBACK语句回退事务中未提交的操作,使数据库返回到事务处理开始前的状态。在PL/SQL过程中,不仅可以包括插入和更新这类的DML操作,还可以包括事务处理语句COMMIT和ROLLBACK。 Oracle支持事务的嵌套,即在事务处理中进行事务处理。在嵌套的事务处理过程中,子事务可以独立于父事务处理进行提交和回滚。对于过程而言,每个过程就相当于一个子事务,用户可以在自己事务处理的任何地方调用该过程,并且无论父事务是提交还是回滚,用户都可以确保过程中的子事务被执行。 下面通过一个示例演示过程中的事务处理。 (1)以用户SCOTT身份连接到数据库,并建立两个表TEMP和LOG_TABLE。 SQL> create table temp(n number); 表已创建。 SQL> create table log_table( 2 username varchar2(20), 3 message varchar2(4000)); 表已创建。 (2)建立一个存储过程INSERT_INTO_LOG,用于向表LOG_TABLE添加记录。 SQL> create or replace procedure insert_into_log(msg_param varchar2) is 2 pragma autonomous_transaction; 3 begin 4 insert into log_table(username,message) 5 values(user,msg_param); 6 commit; 7 end insert_into_log; 8 / 过程已创建。 其中,PRAGMA AUTONOMOUS_TRANSACTION语句表示自动开始一个自治事务,实际上该语句也可以省略。 (3)在匿名程序块中调用INSERT_INTO_LOG过程向LOG_TABLE表中添加数据,并使用INSERT语句向表TEMP添加数据。 SQL> begin 2 insert_into_log('添加数据到TEMP表之前调用'); 3 insert into temp 4 values(1); 5 insert_into_log('添加数据到TEMP表之后调用'); 6 rollback;

什么时候使用存储过程比较适合

什么时候使用存储过程比较适合? 当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对多个状态的判断更改等)要考虑;还有就是比较复杂的统计和汇总也要考虑,但是过多的使用存储过程会降低系统的移植性。为了系统的控制方便,例如当系统进行调整时,这是只需要将后台存储过程进行更改,而不需要更改客户端程序。也无需重新安装客户端应用程序。存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。其威力和优势主要体现在: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。 3.存储过程可以重复使用,可减少数据库开发人员的工作

量。 4.安全性高,可设定只有某此用户才具有对指定存储过程 的使用权。优点: 1.速度快。尤其对于较为复杂的逻辑,减少了网络流量之间的消耗 我有的过程和函数达到了几百行,一个微型编译器,相信用程序就更麻烦了。 2.写程序简单,采用存储过程调用类,调用任何存储过程都只要1-2行代码。 (我不知道别人怎么调用,我是深受其益) 3.升级、维护方便 4.调试其实也并不麻烦,可以用查询分析器 5.如果把所有的数据逻辑都放在存储过程中,那么https://www.360docs.net/doc/d99607945.html, 只需要负责界面的显示阿什么的,出错的可能性最大就是在存储过程。我碰到的就一般是这种情况。缺点: 1.可移植性差,我一直采用sql server开发,可是如果想卖 自己的东西,发现自己简直就是在帮ms卖东西,呵呵。想换成mysql,确实移植麻烦。 2.采用存储过程调用类,需要进行两次调用操作,一次是从sql server中取到过程的参数信息,并且建立参数;第二次 才是调用这个过程。多了一次消耗。 不过这个缺点可以在项目开发完成,过程参数完全确定之后,

存储过程和函数的区别

存储过程和函数的区别 存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。 . l 视图的优点?建立视图的基本语法结构? 视图的优点: 1. 视图对于数据库的重构造提供了一定程度的逻辑独立性。数据的逻辑独立性是指数据库重构造时,如数据库扩大(增加了新字段,新关系等),用户和用户程序不会受影响。 2. 简化了用户观点。视图的机制使用户把注意力集中在他所关心的数据上。若这些数据不是直接来自基本表,则可以定义视图,从而使用户眼中的数据结构简单而直接了当,并可大大简化用户的数据查询操作,特别是把若干表连接在一起的视图,把从表到表所需要的连接操作向用户隐蔽了起来。 3. 视图机制使不同的用户能以不同的方式看待同一数据。 4. 视图机制对机密数据提供了自动的安全保护功能。可以把机密数据从公共的数据视图(基本表)中分离出去,即针对不同用户定义不同的视图,在用户视图中不包括机密数据的字段。这样,这类数据便不能经由视图被用户存取,从而自动地提供了对机密数据的保护。 视图的基本语法结构: CREATE VIEW view_name [(column ][,...n])] AS select_statement 其中view_name为要建立的视图的名称,而AS子句后面的就是建立视图的查询语句。而此语句有以下限制:不能包含ORDER BY、COMPUTE和COMPUTE BY等子句;不能包含INTO 关键字;不能涉及临时表。 . l 事务是什么? 事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为ACID (原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务: 1、原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。 2、一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规

存储过程实例

存储过程的优点 2007-11-02 15:21 1.存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。当对数据库进行复杂操作时(如对多个表进行Update, Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。可以极大的提高数据库的使用效率,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。在代码上看,SQL 语句和程序代码语句的分离,可以提高程序代码的可读性。 3.存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类: (1)系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,如 sp_help就是取得指定对象的相关信息。 (2)扩展存储过程以XP_开头,用来调用操作系统提供的功能 exec master..xp_cmdshell 'ping 10.8.16.1' (3)用户自定义的存储过程,这是我们所指的存储过程常用格式 模版:Create procedure procedue_name [@parameter data_type][output] [with]{recompile|encryption} as sql_statement 解释:output:表示此参数是可传回的 with {recompile|encryption} recompile:表示每次执行此存储过程时都重新编译一次;encryption:所创建的存储过程的内容会被加密。 SQL存储过程实例 2007-11-02 15:24 实例1:只返回单一记录集的存储过程。 表银行存款表(bankMoney)的内容如下

存储过程的创建及其优缺点

首先介绍一下概念,存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,是利用SQL Server所提供的Transact-SQL语言所编写的程序。经编译后存储在数据库中。他可以接收参数,可以返回参数的,当然也可以没有参数。个人理解,他和程序中的函数差不多,只不过他是在数据库中创建的。 存储过程分为系统存储过程和自定义存储过程 存储过程的优点: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这也是我愿意使用它的一个重要原因。 下面是一个带输入参数的一个存储过程 use LineManager go create procProcRegist @CardNovarchar(10), @StuNovarchar(11), @Sex varchar(10), @Grade varchar(10), @ClassNovarchar(10), @ChargeFeevarchar(10), @Name varchar(10), @Department varchar(10), @Explain varchar(50), @UserNamevarchar(10), @OperateDate date ---------------------输入参数 as begin begin transaction insert into Student(StudentNo ,Name ,Sex ,Department ,Grade ,ClassNo ) values (@StuNo ,@Name ,@Sex ,@Department ,@Grade ,@ClassNo ) insert into Regist (CardNo ,StudentNo ,State ,Explain ,UserName ,OperateDate ) values(@CardNo ,@StuNo ,'使用' ,@Explain,@UserName ,@OperateDate ) insert into Charge (CardNo ,ChargeDateTime ,Charge ,UserName ,LastBalance ,CurrentBalanc e ,OrderState ,PrintState )values (@CardNo ,@OperateDate ,@ChargeFee ,@UserName ,0,@ChargeFee ,'未 结账','未打印') if @@ERROR =0

实验三 事务与存储过程.

实验三事务与存储过程 一、实验目的 掌握事务操作、游标操作、存储过程使用。二、实验步骤(一准备数据库 1、创建一个名为“ ERP ” +班号 +学号的数据库; 2、建立如下二维表: 客户表

产品表 订单表 订单明细表 (二事务操作 1、计算订单明细中的金额,等于单价乘以数量。 update T_订单明细 set 金额 =单价 *数量 2、将订单明细的金额在原有基础上加 10元,要求放在事务中执行,执行完毕提交事务 begin transaction update T_订单明细 set 金额 =金额 +10 commit

3、将订单明细的金额在原有基础上减 10元,要求放在事务中执行,执行完毕回滚事务 begin transaction update T_订单明细 set 金额 =金额 -10 rollback 4、在订单表以及订单明细表中将最后一张订单删除,要求使用事务。 begin transaction delete from t_订单 where 订单编号 ='R004' delete from t_订单明细 where 订单编号 ='R004' commit (三游标操作 在订单表中有一个总金额字段, 其值等于该订单中所有产品金额的和, 使用游标计算每一订单的总金额。 计算每笔订单总金额 --计算过程 :定义游标,取出每张订单的订单号 --根据订单号汇总明细,代替订单中的金额 --定义订单号、金额合计内存变量 declare @OrderNO varchar (4 declare @OrderSum numeric (12, 2 --定义游标

事务应用举例

例:事务在银行转帐过程的中的简单应用,将张三的账户(14200101033014122)转1000到李四的账户(14200101000014243)上。 USE stuDB --使用数据库 GO SET NOCOUNT ON --不显示受影响的行数信息 print '查看转帐事务前的余额' SELECT * FROM bank GO BEGIN TRANSACTION --开始事务(指定事务从此处开始,后续的T-SQL 语句是一个整体 DECLARE @errorSum INT --定义变量,用于累计事务执行过程中的错误SET @errorSum=0 --初始化为0,即无错误 UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerNumber='14200101033014122' --转出:张三的账户少了 1000元, SET @errorSum=@errorSum+@@error --累计是否有错误 UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerNumber='14200101000014243' --转入:李四的账户多了1000元 SET @errorSum=@errorSum+@@error --累计是否有错误 print '查看转帐事务过程中的余额' SELECT * FROM bank IF @errorSum<>0 --根据是否有错误,确定事务是提交还是撤销 --如果有错误 BEGIN print '交易失败,回滚事务' ROLLBACK TRANSACTION END ELSE BEGIN print '交易成功,提交事务,写入硬盘,永久的保存' COMMIT TRANSACTION END GO print '查看转帐事务后的余额' SELECT * FROM bank

Spring Service层调用Oracle存储过程保证同一事务

Spring Service层调用Oracle存储过程保证同一事务 在一个标记了@Transactional注解的Spring Service层bean方法里调用了一 个存储过程处理数据,后续还执行一系列的程序代码来处理数据,需要保证后面的程序代码报错后让存储过程插入更新的数据也回滚,即使用的数据库Connection为同一个,也就是说事务要是同一个。 经多次测试发现,通过dataSource获取Connection或者SessionFactory的方式获取Connection,都不是同一个connection,因为连接池返回的不是同一个接连。但通过DataSourceUtil工具获取的连接为同一个connection,因为它是将连接通过TreadLocal的方式绑定在线程本地变量里,使得在整个线程的过程中都使用的是同一个数据库连接,而事务是基于同一个数据库连接的。 例子:亲测可行!!! 存储过程如下: create or replace procedure PRC_TEST(jkdmxx in varchar2,pclywid in number, flag out number) is v_ErrorCode NUMBER; v_ErrorTextVARCHAR2(2000); begin insert into T_JFRXX(JFR_ID,JFR_MC,DLYHMC,JFZH,DW_ID,ZT,CJSJ) values(10000,'成功测试','成功测试 123','033432-180********',10135,'100',sysdate); flag :=1; exception when others then flag :=0; v_ErrorCode := SQLCODE; v_ErrorText := SUBSTR(SQLERRM, 1, 200); rollback; insert into T_JFRXX(JFR_ID,JFR_MC,DLYHMC,JFZH,DW_ID,ZT,CJSJ) values(10001,'失败测试','失败测试 123','033432-180********',10135,'1',sysdate); commit; RAISE_APPLICATION_ERROR(-20001, '单机文件存储过程处理异常'); --抛出异常让程序捕获 end PRC_TEST; 注意:存储过程正常业务逻辑代码里,不能有显示的commit; 程序代码如下: @Override @Transactional(rollbackFor = Throwable.class, readOnly = false)

MySQL存储过程之事务管理

MySQL存储过程之事务管理 MySQL存储过程之事务管理 ACID:Atomic、Consistent、Isolated、Durable 存储程序提供了一个绝佳的机制来定义、封装和管理事务。 1,MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: Java代码 1MyISAM:不支持事务,用于只读程序提高性能 2InnoDB:支持ACID事务、行级锁、并发 3Berkeley DB:支持事务 隔离级别: 隔离级别决定了一个session中的事务可能对另一个session的影响、并发session对数据库的操作、一个session中所见数据的一致性 ANSI标准定义了4个隔离级别,MySQL的InnoDB都支持: Java代码 4READ UNCOMMITTED:最低级别的隔离,通常又称为dirty read,它允许一个事务读取还没commit的数据,这样可能会提高性能,但是dirty read可能不是我们想要的 5READ COMMITTED:在一个事务中只允许已经commit的记录可见,如果session 中select还在查询中,另一session此时insert一条记录,则新添加的数据不可见6REPEATABLE READ:在一个事务开始后,其他session对数据库的修改在本事务中不可见,直到本事务commit或rollback。在一个事务中重复select的结果一样,除非本事务中update数据库。 7SERIALIZABLE:最高级别的隔离,只允许事务串行执行。为了达到此目的,数据

库会锁住每行已经读取的记录,其他session不能修改数据直到前一事务结束,事务commit或取消时才释放锁。 可以使用如下语句设置MySQL的session隔离级别: Java代码 8SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} MySQL默认的隔离级别是REPEA TABLE READ,在设置隔离级别为READ UNCOMMITTED或SERIALIZABLE时要小心,READ UNCOMMITTED会导致数据完整性的严重问题,而SERIALIZABLE会导致性能问题并增加死锁的机率 事务管理语句: Java代码 9START TRANSACTION:开始事务,autocommit设为0,如果已经有一个事务在运行,则会触发一个隐藏的COMMIT 10COMMIT:提交事务,保存更改,释放锁 11ROLLBACK:回滚本事务对数据库的所有更改,然后结束事务,释放锁 12SAVEPOINT savepoint_name:创建一个savepoint识别符来ROLLBACK TO SAVEPOINT 13ROLLBACK TO SAVEPOINT savepoint_name:回滚到从savepoint_name开始对数据库的所有更改,这样就允许回滚事务中的一部分,保证更改的一个子集被提交 14SET TRANSACTION:允许设置事务的隔离级别 15LOCK TABLES:允许显式的锁住一个或多个table,会隐式的关闭当前打开的事务,建议在执行LOCK TABLES语句之前显式的commit或rollback。我们一般所以一般在

范式、储存过程、事务

范式、储存过程、事务测试题 并发操作会带来哪些数据不一致性( D) A.丢失修改、不可重复读、脏读、死锁 B.不可重复读、脏读、死锁 C.丢失修改、脏读、死锁 D.丢失修改、不可重复读、脏读 对于并发操作带来的数据不一致性,解决的办法是并发控制,主要技术是(B)。 A、加密 B、封锁 C、转储 D、审计 用于提交和回滚事务的语句为(B)。 A、 END TRANSACTION 和ROLLBACK TRANSACTION B、 COMMIT TRANSACTION 和ROLLBACK TRANSACTION C、 SAVE TRANSACTION 和ROLLUP TRANSACTION D、 COMMIT TRANSACTION 和ROLLUP TRANSACTION

在数据库事务的四种隔离级别中,不能避免脏读的是(D)。A、 Serializable B、 Repeatable read C、 Read committed D、 Read uncommitted 为了防止一个事务的执行影响其他事务,应该采取(C)。A、 索引机制 B、 故障恢复 C、 并发控制 D、 完整性约束 解决并发操作带来的数据不一致性一般采用(A)。 A、 封锁 B、

C、 授权 D、 协商 通过使用COMMIT 和和ROLLBACK 语句可以结束事务。以下说法正确的是(C)。 A、 某事务执行了ROLLBACK 语句,表示事务正确地执行完毕 B、 某事务执行了ROLLBACK 语句,可将其对数据库的更新写入数据库 C、 某事务执行了ROLLBACK 语句,可将其对数据库的更新撤消 D、 某事务执行了COMIMIIT 语句,其影响可用ROLLBACK 语句来撤销 数据库的并发操作可能带来的问题包括(C)。 A、 增强数据独立性 B、 非授权访问 C、 丢失修改

使用事务的存储过程.

存储过程中的事务实现 一直以为存储过程会自动实现事务操作,其实不然。存储过程只是提供的事务操作的支持。 要实现事务操作,还得自己实现。 基本上方法有两个: SET XACT_ABORT 指定当Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。 语法 SET XACT_ABORT { ON | OFF } 注释 当SET XACT_ABORT 为ON 时,如果Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为OFF 时,只回滚产生错误的Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受SET XACT_ABORT 的影响。 对于大多数OLE DB 提供程序(包括SQL Server),隐性或显式事务中的数据修改语句必须将XACT_ABORT 设置为ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。 SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。 例: create proc testproc as

SET XACT_ABORT on begin tran insert into tableA (field1) values ('aa') insert into tableB (field1) values ('bb') commit tran SET XACT_ABORT off begin tran /*要实现的操作*/ commit tran if @@error>0 rollback 例: create proc testproc as begin tran insert into tableA (field1) values ('aa') insert into tableB (field1) values ('bb') commit tran if@@error>0 rollback

视图、存储过程、函数、触发器、事务和锁等数据库高级对象的使用

第四次报告的主要目的是掌握好视图、存储过程、函数、触发器、事务和锁等数据库高级对象的使用。要求是:完善系统的需求分析和业务流程,设计一些视图、存储过程、触发器等数据库高级对象,说明这些对象的应用场合和使用方法。要求提供创建对象的SQL脚本。(附带创建数据库和数据表的脚本)使用事务,要求提供SQL脚本。 1、创建数据库 create database student --创建数据库:student on primary //创建一个主数据库文件,逻辑文件名为student,物理文件名为student.mdf,存放在C:\Program Files\Microsoft SQL Server\MSSQL\Data目录下,初始大小为10MB,没有指定最大长度,即可以自由增长直到充满整个硬盘空间,自动增长时的递增量为5MB。 ( name=student, filename='C:\Program Files\Microsoft SQL Server\MSSQL\Data\student.mdf', size=10, maxsize=unlimited, filegrowth=5) log on //创建一个事务日志文件,其逻辑文件名为student_log,物理文件名为student_log.LDF,存放在C:\Program Files\Microsoft SQL Server\MSSQL\Data目录下,初始大小为5MB,最大为100MB,自动增长速度为10%。 ( name=student_log, filename='C:\Program Files\Microsoft SQL Server\MSSQL\Data\student_log.LDF size=5, maxsize=100, filegrowth=10%) 2、建表 create table StudentInformation --学生信息表 (cStuId char(8) not null constraint pkStuId primary key, --学生学号,设置为主键,使用了主关键字约束 cStuName char(8) not null, --学生姓名 cSex char(2) check(cSex='男'or cSex='女'), --性别,性别只能取男或者女,使用了检查约束 cStuNative char(20),--籍贯 sStuBirthday smalldatetime,--出生日期 cDepartmentId char(6) not null references Department(cDepartmentId),--院系编号,设置为外键,使用了外关键字约束 cSpecialityId char(8) not null references Speciality(cSpecialityId),--专业编号,设置为外键,使用了外关键字约束 cClassNum char(4),--班号 sEnterTime smalldatetime,--入学时间

存储过程学习

1. 存储过程和函数的区别 存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。 2. 事务是什么? 事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务: 原子性 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。 一致性 事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如B 树索引或双向链表)都必须是正确的。 隔离性 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。 持久性 事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。 3. 游标的作用?如何知道游标已经到了最后? 游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。 4. 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。 5. 存储过程的编写 6. 在一个查询中,使用哪一个关键字能够除去重复列值。 distinct 7. 什么是快照?它的作用是什么? 快照Snapshot是一个文件系统在特定时间里的镜像,对于在线实时数据备份非常有用。快照对于拥有不能停止的应用或具有常打开文件的文件系统的备份非常重要。对于只能提供一个非常短的备份时间而言,快照能保证系统的完整性。 8. 解释存储过程和触发器; 存储过程是一组Transact-SQL 语句,在一次编译后可以执行多次。因为不必重新编译Transact-SQL语句,所以执行存储过程可以提高性能。 触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。 9. sql server是否支持行级锁,有什么好处? SQL Server 2000 动态地将查询所引用的每一个表的锁定粒度调整到合适的级别。当查询所引用的少数几行分散在一个大型表中时,优化数据并行访问的最佳办法是使用粒度锁,如行锁。但是,如果查询引用的是一个表中的大多数行或所有行,优化数据并行访问的

存储过程的优缺点

优点 ①重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。 ②提高性能。存储过程在创建的时候在进行了编译,将来使用的时候不再重新翻译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。 ③减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。 ④安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。 简单讲: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。 3.存储过程可以重复使用,可减少数据库开发人员的工作量 4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权 有一点需要注意的是,一些网上盛传的所谓的存储过程要比sql语句执行更快的说法,实际上是个误解,并没有根据,包括微软内部的人也不认可这一点,所以不能作为正式的优点,希望大家能够认识到这一点。 缺点 1:调试麻烦,但是用PL/SQL Developer 调试很方便!弥补这个缺点。 2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。 3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。 4:如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦

相关主题
相关文档
最新文档