发表于: 2006.07.12 00:52
分类: TIMESTEN
出处: http://yangtingkun.itpub.net/post/468/137300
---------------------------------------------------------------
配置SYNCHRONOUS WRITETHROUGH CACHE GROUP从语法和READONLY CACHE GROUP和相似。这里主要描述的不是如何建立SWT CACHE GROUP,而是SWT CACHE GROUP的一些特点。
建立SWT的过程很简单:
F:>ttisql test_cache
Copyright (c) 1996-2006, Oracle. All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
All commands must end with a semicolon character.
connect "DSN=test_cache";
Connection successful: DSN=test_cache;UID=YANGTINGKUN;DataStore=F:timestenstor
eTEST_CACHETEST_CACHE;DRIVER=C:WINDOWSSystem32ttdv60.dll;OracleId=TEST1;Pe
rmSize=20;TempSize=20;
(Default setting AutoCommit=1)
Command> call ttcacheuidpwdset('yangtingkun', 'abc');
Command> call ttcachestart();
Command> autocommit 0;
Command> create synchronous writethrough cache group testcache
> autorefresh interval 5 seconds
> from t (id int primary key);
7025: Illegal use of reserved keyword "FROM", character position: 88
The command failed.
Command> create synchronous writethrough cache group testcache
> from t (id int primary key);
Command> select * from t;
0 rows found.
Command> commit;
Command> load cache group testcache commit every 30 rows;
6 rows affected.
Command> commit;
Command> select * from t;
< 1 >
< 2 >
< 3 >
< 4 >
< 5 >
< 7 >
6 rows found.
SWT CACHE GROUP对CACHE GROUP对象的修改首先在Oracle进行提交,如果提交成功,则在Timesten中提交事务。通过这种方式,来保证所有的修改在Oracle和Timesten同步执行。
但是,通过测试发现SWT的工作原理和我想象的不大一样。
CACHE GROUP的修改不是首先在Oracle中执行,而是首先在Timesten中执行。在发出COMMIT的时刻,会将事务的所有修改在Oracle中运行,并尝试提交。如果运行成功并提交,则在Timesten中提交事务。如果在Oracle中发生了错误,则报错,并提示用户对Timesten事务进行ROLLBACK。
下面的例子可以说明上面的推测:
首先在Oracle中的表t内插入一条ID为8的数据。
SQL> insert into t values (8, 'ab');
已创建 1 行。
SQL> commit;
提交完成。
然后在Timesten中执行对t表插入数据的操作,ID的值也为8。
Command> insert into t values (8);
1 row inserted.
Command> commit;
5210: Oracle unique constraint violation error in OCIStmtExecute(): ORA-00001:
ΥΨ?? (YANGTINGKUN.SYS_C002083) rc = -1
5055: Cannot synchronize Oracle with TimesTen. The TimesTen transaction must b
e rolled back.
5025: Commit failure in Oracle. Transaction must be rolled back in TimesTen.
The command failed.
Command> rollback;
插入执行成功了,这说明这个执行只是在TIMESTEN中执行。而后在提交时发生了错误,说明这个时候插入操作才在Oracle上执行。
感觉Timesten和Oracle的这种同步工作方式有一些问题,首先,Timesten推迟了在Oracle中执行时间。把执行时间从语句的执行时刻延迟到了事务提交时刻,这个延迟会引起很多事务一致性的问题。
第二,对于COMMIT操作的处理很不相同,在Oracle中,提交进行的操作很少,而且除了分布式事务,COMMIT都可以保证执行成功。即使是在分布式事务中,提交的失败也是由于分布式环境中个别数据库不可用造成的。而Timesten中进行提交时,所有的操作都还没有在Oracle上运行过,COMMIT操作失败的可能性大大增加。
最后,感觉Timesten的rollback操作应该自动完成,如果提交失败,则除了回滚外没有其他的选择,而且,这时候在Timesten中执行任何非ROLLBACK的操作都会报错,那么为什么不直接自动进行ROLLBACK操作呢。
在Timesten上的修改可以同步修改到Oracle,但是在Oracle上进行的修改无法自动的同步到Timesten上,因此,Timesten上展示的数据无法避免的会和Oracle中最新的数据有所差异,而且这种差异有不断扩大的趋势。
从上面几点分析可以看出,SWT CACHE GROUP是基本上无法保证Timesten和Oracle数据库数据的完全同步的。











