还有些许遗漏,实验理论上并不十分严密!

1、  事务隔离级别设置

Oracle有两种事务隔离级别,分别是Connection.TRANSACTION_READ_COMMITTED(读已提交)和Connection.TRANSACTION_SERIALIZABLE(串行读)。如果设置隔离级别出错,会抛异常如下java.sql.SQLException: 仅 READ_COMMITTED 和 SERIALIZABLE 是有效的事务处理级。

 

 

DBF仅仅支持Connection.TRANSACTION_READ_COMMITTED(读已提交),其它类型的数据库事务隔离级别,当前使用的驱动不支持,会抛异常。

 

 

2、  在开启事务情况下的对比:

实验一:程序中开两个线程,一个批量提交(每次插入100条数据),一个去读数据库。原始表中数据为空。

 

Oracle在事务开启时,如果没有做commit操作,其它线程是不会读到未提交的数据的。在这种情况下,读数据的线程每次读出的数据数目都是100的整数。另外加上删除线程以后也是一样的。

第:1次查询

查询影响数据数目:0

第:2次查询

查询影响数据数目:0

第:3次查询

查询影响数据数目:0

第:4次查询

查询影响数据数目:100

第:1次插入

第:5次查询

查询影响数据数目:100

第:2次插入

第:6次查询

查询影响数据数目:200

第:7次查询

查询影响数据数目:300

第:8次查询

查询影响数据数目:300

第:9次查询

查询影响数据数目:300

第:10次查询

查询影响数据数目:300

第:11次查询

查询影响数据数目:300

 

 

而对于DBF数据库来说,虽然事务开启了,但是其它线程可以读到当前线程未提交的数据。理论上来说,读取数据的线程每次读出的数据个数应该是100的倍数,但是实际情况不是这样的。运行结果如下:

查询影响数据数:0

查询影响数据数:0

查询影响数据数:24

查询影响数据数:43

查询影响数据数:57

查询影响数据数:75

查询影响数据数:93

插入影响数据数:100

查询影响数据数:100

查询影响数据数:100

查询影响数据数:120

查询影响数据数:138

查询影响数据数:155

查询影响数据数:169

查询影响数据数:187

插入影响数据数:100

查询影响数据数:200

根据测试结果来看,事务设置的隔离级别似乎没有生效,读到了写数据的线程没有提交的数据,没有达到预期的不读中间数据的目的。

 

 

 

注意:

dbf一种特殊的文件格式!表示数据库文件,Foxbase,Dbase,VisualFoxPro,等数据库处理系统所产生的数据库文件! 本身并不是数据库。

如果说需要用到传统的数据库事务,那么可不可以有一个中间过程,程序操作在传统的大型数据库Oracle或者SQL Server上进行,然后最后导出成DBF文件。通过存储过程或者程序。

相关参考文献如下:

http://wenku.baidu.com/view/4965352b3169a4517723a33f.html

http://wen-xudong7.javaeye.com/blog/409181

http://tech.it168.com/oldarticle/2006-07-18/200607181949046.shtml