还有些许遗漏,实验理论上并不十分严密!
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