迷彩 潜伏 隐蔽 伪装
分类: Sybase
2013-09-13 11:25:07
原文地址:ASE中事物的模式——基本概念 作者:lion_sybiq_127
事务模式(transaction mode)定义了事务开始是否需要显示地执行"begin transaction"语句,事务的结束是否需要显示地执行"commit"或"rollback"语句。ASE数据库支持两种事务模式:链式模式(ANSI SQL标准) 和非链式模式。下面将下大家介绍这两种事务模式的有关知识:
1. 链式模式(chained mode)
在这种事务模式下,用户不需要显示地执行"begin transaction"语句,当头一次执行如下SQL语句时数据库会自动开始一个事务:
* select
* insert
* update
* delete
* open
* fetch
* exec
在链式模式下,事务必须显示地发出commit或rollback语句才能结束。对于链式事务模式,当事务执行的第一个SQL语句是上面所列出的语句时,ASE会自动发出一个隐式的"begin trasaction"。
2. 链式模式(unchained mode)
"非链式模式",又叫做"自动提交"模式。当执行完一条DML 语句之后,比如insert、update、delete,ASE会自动提交事务。如果事务运行在非链式模式下,并且事务要执行多个SQL语句的话,必须显示地执行"begin transaction"开始事务,执行"commit"或"rollback"语句以结束事务。这种事务模式是ASE中(比如isql和open client应用)事务的缺省模式。
对于应用开发者来说,必须要知道有关事务模式的知识,这样才能正确进行选择。我们在确定事务的执行行为和结果时,一定要知道他所处的事务模式,否则将无法确定。我们看下面一组语句:
insert into accounts(actno, balance) values ('1111111',3000)
begin transaction
update accounts set balance = balance + 100
where actno = '1111111'
rollback transaction
上面的一组语句如果运行在"非链式"模式下,执行结果将是accounts表中新增一条记录:账号为'1111111',余额为3000。
如果运行在"链式"模式下,那么上面这组语句的执行结果是accounts表中没有插入记录。在链式模式下,执行第一条insert语句时,ASE会自动开始一个事务;当执行语句组中的第2条语句"begin transaction"时,会开始一个嵌套子事务(这时select @@trancount显示为2);当执行语句 rollback transaction 时,ASE会把事务回滚(对于本示例来说,会把内层事务和外层事务所的改变都回滚),所以没有记录插入。