transaction

上一篇 / 下一篇  2015-12-11 13:53:46 / 个人分类:data

事务(transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit),事务是恢复和并发控制的基本单位

事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句

一般出现在需要针对多个表做更新时,如果某条执行失败,为保证数据完整性,需要使用事务回滚

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

并发执行的各个事务之间不能互相干扰,事务属于并发控制的单位,属于用户定义的操作序列,这些操作要么都做,要么都不做,属于不可分割的工作单位。通过事务,SQL server将逻辑相关的一组操作绑定在一起,以便服务器保持数据完整性

事务一般情况下以begin transaction开始,以commit或是rollback结束(如果rollback回滚,说明事务没有执行,对相关的数据表没有产生影响)

其中commit表示提交,即提交事务的所有操作,即将事务中所有对数据库的更新都写到磁盘的物理数据库中,事务正常结束

ROLLBACK表示回滚,即事务运行的过程中产生某种障碍,事务不能继续进行,事务将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始的状态

 

当多个表进行更新时,如果某条语句执行失败,为保证数据完整性,需要使用事务回滚

事务运行的三种模式:

1)自动提交事务

每条单独的语句都是一个事务,每个语句后都隐含一个commit

2)显式事务

begin transaction显式开始,以commitrollback显示结束

2)隐性事务

在前一个事务完成时,新事务隐式启动,但每个事务仍以commit或是rollback显式结束

3)事务的特性

事务属于数据库的逻辑工作单位,事务中包含的操作要么全做,要么不做

事务的执行结果必须是使数据库从一个一致性状态变成另一个一致性概念。一个事务的执行不会对其他事务干扰

一个事务一旦提交,对数据库中数据的改变属于永久性的

关于事务是指:一个方法完成一件事情的总过程,会涉及到多个数据表中数据的修改

比如隐患审核,会涉及到修改相关人相关部门表、提醒、积分(等),只有整个流程完成,才算一个事务的完成

如果审核成功,对应的各个数据表中的数据都要做修改

如果出现审核成功,但是没有产生积分(那么就属于系统bug,就算这个事务没有成功,虽然数据库中隐患的状态发生改变了,但是积分没有成功)

 

测试性能时:需要设置一个事务的起始点和结束点,那么就需要从审核开始设置起始点、中间过程涉及到

 

例子:

实际生活中,转账过程属于一个事务,需要两条update语句来完成,两条语句属于一个整体,如果任何一条出现错误,转账业务就应该取消,两个账户的余额恢复到之前的数据,从而保证转账前和转账后的余额保持不变

事务的成功:跟设定当前事务的目的有关,如果目的实现,算成功

           如果目的没有实现,算是失败

比如银行转账,如果转账成功,双方转账的额度正确,算事务成功

             如果回滚,双方的账户余额没有发生改变,算是事务失败

             也会出现一种情况,转账了,转账方的额度减少了,但是接收方的余额并没有发生改变,说明没有设定事务,如果设定了事务,双方的效果是同时产生的,不会出现一部分改变;一部分未变的情况

TAG:

tester_kong 引用 删除 tester_kong   /   2015-12-11 14:00:10
关于savepoint

用户在事务(transaction)内可以声明(declare)被称为保存点(savepoint)
的标记。保存点将一个大事务划分为较小的片断。

用户可以使用保存点(savepoint)在事务(transaction)内的任意位置作标
记。之后用户在对事务进行回滚操作(rolling back)时,就可以选择从当前
执行位置回滚到事务内的任意一个保存点。例如用户可以在一系列复杂的更
新(update)操作之间插入保存点,如果执行过程中一个语句出现错误,用
户 可以回滚到错误之前的某个保存点,而不必重新提交所有的语句。

在开发应用程序时也同样可以使用保存点(savepoint)。如果一个过程
(procedure)内包含多个函数(function),用户可以在每个函数的开始位置
创建一个保存点。当一个函数失败时, 就很容易将数据恢复到函数执行之前
的状态,回滚(roll back)后可以修改参数重新调用函数,或执行相关的错误
处理。

当事务(transaction)被回滚(rollback)到某个保存点(savepoint)后,
Oracle将释放由被回滚语句使用的锁。其他等待被锁资源的事务就可以继续
执行。需要更新(update)被锁数据行的事务也可以继续执行。

将事务(transaction)回滚(roll back)到某个保存点(savepoint)的过程如
下:
1. Oracle 回滚指定保存点之后的语句
2. Oracle 保留指定的保存点,但其后创建的保存点都将被清除
3. Oracle 释放此保存点后获得的表级锁(table lock)与行级锁(row
lock),但之前的数据锁依然保留。

被部分回滚的事务(transaction)依然处于活动状态,可以继续执行。

一个事务(transaction)在等待其他事务的过程中,进行回滚(roll back)到
某个保存点(savepoint)的操作不会释放行级锁(row lock)。为了避免事务
因为不能获得锁而被挂起,应在执行 UPDATE 或 DELETE 操作前使用 FOR
UPDATE ... NOWAIT 语句。(以上内容讲述的是回滚保存点之前所获得的
锁。而在保存点之后获得的行级锁是会被释放的,同时保存点之后执行的
SQL 语句也会被完全回滚)。
tester_kong 引用 删除 tester_kong   /   2015-12-11 13:56:51
http://www.2cto.com/database/201208/146734.html
 

评分:0

我来说两句

Open Toolbar