Month: 九月 2011

事务计数器和事务嵌套

 - by Hector
1.计数方法
事务计数器从0开始,没嵌套一个事务,事务计数器+1,COMMIT一个事务计数器-1.
注意:事务保存点属于事务内部,不会对事务计数器产生影响。

下面的示例演示嵌套的 BEGIN 和 COMMIT 语句对 @@TRANCOUNT 变量产生的效果。
[code lang="sql"]
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The COMMIT statement will decrement the transaction count by 1.
COMMIT
PRINT @@TRANCOUNT
COMMIT
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--1
--0
[/code]

2. 事务回滚对事务计数器的影响
当子事务ROLLBACK之后,会直接清零TRANCOUNT,下面的示例演示嵌套的 BEGIN TRAN 和 ROLLBACK 语句对 @@TRANCOUNT 变量产生的效果。
[code lang="sql"]
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The ROLLBACK statement will clear the @@TRANCOUNT variable
-- to 0 because all active transactions will be rolled back.
ROLLBACK
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--0[/code]
3.使用保存点确保事务嵌套时能正确回滚
[code lang="sql"]
begin transaction trn_example

update tableName set fieldName = @value
save transaction stk_savePoint
update tableName2 set fieldName2 = @value2
if @@error<>0
begin
rollback transaction stk_savePoint
commit transaction
return
end
else
begin
if @@rowcount = 0
rollback transaction
end
commit transaction
--如果第二个update出现错误,就返回到第一个update后提交,并且使用return截断后面的语句继续运行
--如果第二个update正确执行,就是更新的行数是0,就回滚整个事务,把第一个update执行的结果也取消
[/code]

Unit ExtActns was compiled with a different version of Consts.SUrlMonDllMissing

 - by Hector

很恶心的问题,安装了delphi6 D6_upd2_ent.exe升级包后,原来的程序报出这样的错误。
解决办法:
查找delphi6安装目录下的Consts.dcu,ExtActns.dcu文件,并删除,
打开delphi,打开你的程序,并找到Consts.pas中添加常量:SUrlMonDllMissing= ‘Unable to load %s’;
位置如下:
[code lang="pascal"]
unit Consts;

interface

resourcestring
SUrlMonDllMissing= 'Unable to load %s';
SOpenFileTitle = '打开';
[/code]

事务的脏读,不可重复读,虚读

 - by Hector

基本定义

1.脏读 dirty reads
其他事务读取的值被回滚了。当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。
2.不可重复的读 non-repeatable reads
同一事务两次读的结果不一样(数据被修改)。当事务两次读取同一行数据,但每次得到的数据都不一样时,就会发生这种事件。举例来说:Transaction 1 读取一行数据,然后 Transaction 2 修改或删除该行并提交修改操作。当 Transaction 1 试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)。
3.虚读 phantom read
同一事务两次取到不同的行。如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。举例来说:Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索条件的一个新行。如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行。

Delphi中资源文件使用小结

 - by Hector

一.编写 RC 脚本文本

用记事本或其它文本编辑器编写一个扩展名为“.rc”的文件。格式如下:

  •   AVI 无声动画
  •   BITMAP 位图文件
  •   CURSOR 光标文件
  •   ICON 图标文件
  •   WAVE 声音文件

RC脚本编写格式如下

    mycur cursor move.cur //加入光标
  mypic Bitmap Water.BMP //加入位图
  mywav WAVE happy.wav //加入声音
  myAVI AVI EPOEN.AVI //加入视频
  myIco ICON CJT.ICO //加入图标

以上所列均为标准资源类型,也可以给资源自定义一个类型,如:“GIFTYPE”。不过两者在调用方式上有些不同。