数据库系统中的事务,是保证系统在发生故障后或存在并发操作的情况下,数据库中的数据与企业业务结果相一致
一、事务的概念
在许多数据库应用系统中,数据库用来存储现实世界中一些企业的状态信息或其管理的数据
1、概念一
(1)事务就是为了维护企业状态与数据库状态相一致的与数据库交互的程序
(2)举例
比如银行信息管理系统中的转账事务就是为了反应银行客户的账户间的资金变化,更新数据库中的账户信息,最终使得转账后的数据库中的当前数据,即数据库状态,与银行的账户情况一致
2、概念二
(1)事务不是一种普通的程序,事务是一组需要一起执行的操作序列,是数据库系统中的逻辑工作单元。
所谓逻辑工作单元,指的是从用户的角度看,事务是数据库系统中执行的最小程序段
3、概念三
(1)对于关系型数据库,事务程序中包含的操作,可以是一条SQL语句、一组SQL语句或一个应用程序段。
在没有显示定义一个事务的情况下,系统默认每个SQL语句就是一个事务
(2)所以如果不把账户A转账1000元到账户B的操作设计的两个更新语句定义在一个事务中,转账操作中的这两个更新语句就是两个事务。那么如何把转账操作涉及的两个数据库更新语句定义为一个转账事务呢?
二、事务的定义
1、用BEGIN TRANSACTION来标记事务的开始
2、然后是事务所包含的SQL语句或程序段
3、最后以两种方式结束事务
(1)一种是以COMMIT语句提交事务,表示事务中的所有操作语句均已执行,其中对数据库的更新操作结果应写到磁盘中的物理数据库中去,数据库进入一个新的状态
(2)事务的另一中结束方式是以ROLLBACK语句回滚事务,该语句的执行表示事务执行的过程中发生了某种故障,事务夭折(abort)不能继续执行,事务夭折前所有已完成的对数据库的更新操作结果应该撤销,使数据库恢复到该事务执行前的数据库状态
三、事务举例:COMMIT和ROLLBACK的用法
1、把从账户A转账1000元到账户B的转账操作定义为一个事务,并对该事务以COMMIT和ROLLBACK两种不同的方式结束,看一下事务执行后的数据库结果
(1)创建ACCOUNTS表
create table accounts(
acctNo char(20) primary key,
balance float,
check(balance>=0)
);
(2)使用ROLLBACK结束事务
begin transaction
select * from accounts;
update accounts
set balance=balance-1000
where acctNo='A'; /* 从账户A中减去1000元*/
update accounts
set balance=balance+1000
where acctNo='B'; /* 从账户B中加上1000元*/
select * from accounts;
rollback
select * from accounts;
以ROLLBACK语句结束事务时,事务结束前转账成功,而事务结束后事务中对数据库的所有更新操作结果被撤销了,数据库中数据的值又恢复到事务开始时的状态
(2)使用COMMIT结束事务
begin transaction
select * from accounts;
update accounts
set balance=balance-1000
where acctNo='A'; /* 从账户A中减去1000元*/
update accounts
set balance=balance+1000
where acctNo='B'; /* 从账户B中加上1000元*/
select * from accounts;
commit
select * from accounts;
而以COMMIT语句结束事务时可看到事务结束后事务中对数据库的所有更新操作结果被保存在数据库中了
四、小结
1、事务时数据库系统中的逻辑工作单元
2、用SQL语言定义事务
- BEGIN TRANSACTION
- COMMIT
- ROLLBACK
因此,在具体的应用过程中,当我们需要将含有多个数据库操作的语句序列或程序作为一个不可分割的整体进行执行时,就需要使用数据库操作语言来定义一个事务。事务的执行结果有两种情况,要么提交,要么回滚
、