务
连接到一个数据库
COMMIT 或 ROLLBACK
BEGIN TRANSACTION
2、除非明显地给出 COMMIT 或 ROLLBACK否则一个事务绝不会结束
3、为与ASE兼容,可把Adaptive Server Anywhere设置为非链式模式 (隐含地实现 COMMIT)
交互式 SQL 及 COMMIT(提交) :
1、交互式SQL具有自动提交的选项:
a>使在每个命令之后自动提交
模拟非链式模式
b>完成现有的交互式 SQL时自动提交
2、千万留神!你正在使用的是什么选项
SET OPTION auto_commit = 'on‘;
SET OPTION commit_on_exit = 'on‘;
SET PERMANENT;
COMMIT and ROLLBACK:
1、COMMIT 让修改永久化
该事务中的所有语句都被执行成功了
2、ROLLBACK 把所有的改变全部复旧(undo)
事务中的任何语句失败时
SELECT . . .;
UPDATE . . .;
IF . . . THEN COMMIT
ELSE ROLLBACK
END IF;
要考虑应用的可移植性 :
1、为避免在不同模式中的二意性,应当:
a>每个事务都用 BEGIN TRAN开始
b>每个事务都用 COMMIT 或 ROLLBACK结束
实例
BEGIN TRANSACTION;
UPDATE…;
INSERT…;
COMMIT TRANSACTION;
保存点 :
1、用来界定在一个事务中一组逻辑上相关的任务
2、使得能根据某种条件逻辑仅把事务中的一部分进行回滚
3、保存点可被嵌套
4、在数据行数较多的事务中很有用
建立保存点 :
语法
SAVEPOINT savepoint-name;
实例
SAVEPOINT spt_abc;
回滚到保存点:
1、把自该保存点之后完成的工作全部复旧(undo)
ROLLBACK TO SAVEPOINT [savepoint-name];
2、例 1 — 回滚到 spt_123
SAVEPOINT spt_abc;
INSERT…;
SAVEPOINT spt_123;
UPDATE…;
ROLLBACK TO SAVEPOINT spt_123;
3、例 2 — 回滚到 spt_abc
SAVEPOINT spt_abc;
INSERT…;
SAVEPOINT spt_123;
UPDATE…;
ROLLBACK TO SAVEPOINT spt_abc;
释放保存点 :
1、从激活的保存点清单中删去保存点
2、仍能回滚到一个已释放的但命了名的保存点
3、并不释放任何锁 锁在整个事务期间都被保持
例 1 —释放最近的保存点
RELEASE SAVEPOINT;
例 2 —释放保存点spt_abc
RELEASE SAVEPOINT spt_abc;
事务处理 :
1、作为一个事务看待的逻辑上相关各SQL语句必须作为单个工作单元来执行 2、当系统故障时事务中的数据必须被恰当地恢复
3、并发作用于同一数据上的各事务在执行时不可破坏数据一致性
提交保存点完成的改变 :
1、只要事务尚未被提交,自某些特定的保存点之后完成的改变都能被回滚。
2、仅当整个事务被提交时,才提交各保存点的改变。
回滚日志(Rollback Log)
用于保证事务的原子性!
1、储存在内存及该数据库文件中
2、包含被事务修改了的各数据行的前映象及“逆向SQL”操作
3、当事务被提交或回滚时,属于该连接的回滚日志被抹去.
事务结束:
COMMIT — 回滚日志被释放
ROLLBACK — 利用回滚日志重置以前的值
事务的并发性 :
1、事务之间会造成彼此干扰
2、利用锁和阻塞机制来处理这种干扰
锁机制:
1、防止并发事务彼此造成干扰
2、自动实现行级锁
3、封锁被保持到COMMIT 或 ROLLBACK
4、四种锁: 写 插入 读 幻象(Phantom)
5、两大类: 共享(Shared) 排它(Exclusive)
共享锁:
1、读锁
a>对一个具有读锁的行其它事务仍可对该行获得读锁
b>防止写锁
c>不能对具有写锁的行获得读锁
2、幻象(Phantom)锁
a>防止在幻象锁行之前马上插入数据
b>在利用索引查询和进行表扫描时使用它
c>幻象锁会降低写入性能
排它锁:
1、写锁
a>对含有写锁的行,其它事务再也不能获得任何类型锁。
b>对含有任何类型锁的行,其它事务再也不能获得写锁。
2、插入锁
a>获得往一个特定位置插入一行的权力
b>当利用读锁防止其它事务的更新或删除时,同时获得插入锁。
事务的阻塞:
1、排他锁会产生潜在的冲突
第二个事务所请求的资源已被另一个事务的封锁给阻塞
2、解决冲突的办法是:
a>让第二个事务等待
b>迫使第二个事务的锁请求失败
阻塞的配置:
1、BLOCKING ON 迫使事务等待
2、BLOCKING OFF 迫使事务的锁请求失败
3、实例:
SET OPTION BLOCKING = 'OFF'
SET OPTION BLOCKING = 'ON'
权衡:
1、BLOCKING OFF 适用于DSS应用(事务中涉及大量数据)
迫使事务请求失败
2、BLOCKING ON 适用于OLTP应用(事务短小) 潜在地会产生死锁
死锁:
1、两个以上的事务竞争同样的资源
2、一组事务同时进入了无法获得某种资源而继续进行下去的状态。
3、BLOCKING 是 ON
4、死锁的两种类型:
a>循环阻塞
b>线索阻塞
5、牺牲最后一个被死锁的事务
循环阻塞:
1、各事务彼此等待对方已占有的资源
2、除非获得它们所需资源否则事务处于阻塞状态
3、被阻塞的事务不会释放锁
4、形成死锁解决办法:
a>自动发现死锁
b>第一个事务继续下去
c>把最后一个被阻塞的事务回滚
必须让客户应用能发现这种情况并且重新提交该事务
如何减少循环阻塞:
1、都按约定的次序 (比如按字母顺序)对多个表进行更新
2、事务应尽可能地小(只把确实必须作为一个工作单元的,以原子化方式执行的操作放在同一个事务中)。
线索阻塞:
1、在数据库引擎中全体可激活的执行线索(缺省值为20个)
2、被阻塞的事务并不释放执行线索
3、形成死锁解决办法:
a>自动发现死锁
b>把最后被阻塞的事务回滚
c>较早的事务利用释放的线索继续下去
如何减少线索阻塞
1、事务应尽可能地短小
2、利用 -gn 参数增加数据库线索
dbsrv7 -gn 50 mydata
隔离级别:
1、指定读封锁的级别
2、读锁是可以选择的
3、较低的隔离级别会导致数据的不一致性
4、四个隔离级别
a>级别 0 ( Adaptive Server Anywhere的缺省级别)
b>级别 1 (ASE的缺省级别)
c>级别 2
d>级别 3
级别 0 :
1、不管数据行是否具有写锁都可读取
2、无法保证并发的事务又对该行进行修改或是把修改又给回滚
级别 1 :
1、允许读取未加写锁的数据行
2、仅在并发地读取该行时施加并保持读锁
3、不能保证在整个事务期间该行数据不再改变
级别 2:
1、仅能读取未加写锁的数据行
2、施加读锁后要一直保持到事务结束
级别 3 :
1、仅能读取不含写锁的结果集中的数据行
2、对结果集中的每一行及其用到的每一个索引都施加读锁且保持到事务结束
ODBC 用法 ?
ANSI级别 ODBC 主要特性
O RU 读未提交的事务
1 RC 读已提交的事务
2 RR 可重复读
3 TS 事务串行化
事务并发性和一致性:
low consistency high
isolation level 3
isolation level 2
isolation level 1
isolation level 0
low concurrency high
脏 读:
一个事务读取了被并发事务作了修改但后来又作了回滚的数据行
事务 A 修改数据行
事务 B 读取该行
事务 A 执行了回滚
由此,事务 B 获得了一个无效的(脏)数据。
无法重复读:
在一个事务中,对同一数据行读取多次,但各次获得不同结果。
事务 A 读取一行数据
事务 B 对该行作了更新或删除并且提交了其改变
事务 A 又来读该行
在第二次,事务 A 获得不同的数据或者错误码
幻想行:
在一个事务中对同一数据行集合读取多次,但各次获得不同结果
事务 A 利用 WHERE子句选取一组数据。
事务 B 对满足事务A中 WHERE 条件的数据行又执行了插入,更新或删除操作。
事务 A 仍利用同样的 WHERE子句来选取数据。
在第二次,事务 A 获得不同的结果集。
隔离级别的选择:
1、级别 0 (RU)
允许脏读,无法重复读及出现幻象行。
适用于读取大量数据的应用中。
2、级别1 (RC)
防止脏读
允许无法重读及幻象行
适应于读取大量数据的应用中
3、级别 2 (RR)
防止脏读及无法重复读
允许幻象行
适应于要求事务处理串行化的应用中
4、级别 3 (TS)
防止脏读
无法重复读及幻象行
适应于要求事务处理串行化的应用中
推荐作法:
1、利用较低的隔离级别作为缺省
2、针对事务中致关重要的读操作设置为更高的级别
3、应当及时降回到较低隔离级别
小 结
1、一个事务是一组逻辑上相关并要求作为一个原子化的工作单元来完成的任务。
2、一个保存点是在一个事务中的一组逻辑上的相关的任务。
3、Adaptive Server Anywhere 利用回滚日志( 回滚日志)来保证一个事务作为一个整体被完成,如果不能被成功地完成则全部复旧。
4、当 Adaptive Server Anywhere 在系统故障之后被重新启动时,它能利用校验点,事务日志及回滚日志自动把数据恢复到一致状态。
5、为防止并发事务彼此进行干扰, Adaptive Server Anywhere 自动实现行级封锁。
6、排它锁潜在地使事务间产生冲突。
jazy 回复于:2003-02-23 18:13:59
存储过程
目标 :
1、定义存储过程
2、建立一个简单存储过程
3、讨论存储过程的优点和缺点
4、通过实例介绍Adaptive Server Anywhere对SQL的过程化扩展
5、说明存储过程的结构
6、定义一个复合语句
7、解释输入参数与存储过程返回的结果集之间的差别
内容
1、关于存储过程
2、建立存储过程
3、过程化语言
4、调用存储过程
存储过程:
1、SQL 语句和流程执行语句
2、仅允许间接存取数据
3、封装着公用的: 算法和事务
4、它被存储在系统表 SYSPROCEDURE中
5、仅在该过程第一次被执行时进行编译
6、可接收输入参数
7、可调用其它存储过程
8、可返回状态值
9、可返上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页 |