node-webkit中sqlite3事务提交后事务没完成就回调的解决方案

node-webkit中,用sqlite3的库来创建本地sqlite数据库,并且同步服务器数据到本地,如果数据量大时,事务执行要很久,而回调很快返回,不是想像中的执行完事务才返回结果,在实时性要求高或后面的处理依赖事务完成才执行的情况下,会出bug,本文用循环查询来确定事务是否完成,才执行回调.

示例代码如下,在pubservices数据有两万多条时处理比较久,能明显看出来通常情况下事务处理完后回调了但数据没有全部保存进去,数据少时会有概率性看得出来.

var _=require("underscore");
var sqlite3=require("sqlite3");
var baseDB = new sqlite3.Database(yourPath+‘//database.db‘);
this.pubserviceSync = function (pubservices,callbacks){
	        try{
	        //stml存sql的临时变量
	        //readyInterval存循环查询的变量 
	        //beginPubserviceCount存查询出来数量的变量 
	        	var stmt,readyInterval,beginPubserviceCount=0;
	        	baseDB.run("BEGIN TRANSACTION");
				baseDB.run("PRAGMA synchronous=OFF");
				//删除服务号
	        	stmt = baseDB.prepare("DELETE FROM pubservice");
		        stmt.run();

				//增加服务号
				stmt = baseDB.prepare("insert into pubservice (pubserviceId,name,avatarId,recommend,createdAt,updatedAt) values ($pubserviceId,$name,$avatarId,$recommend,$createdAt,$updatedAt)");
				_.each(pubservices,function(pubservice){
					stmt.run({
					$pubserviceId:pubservice.pubserviceId,
					$name:pubservice.pubserviceName,
					$avatarId:pubservice.avatarId,
					$recommend:pubservice.recommend,
					$createdAt:new Date().toISOString(),
					$updatedAt:new Date().toISOString()
					})
				});
				stmt.finalize(function(){
					baseDB.run("COMMIT TRANSACTION",function(err){
						if(err){
							callbacks(err);
						}else{
							readyInterval = setInterval(function(){
		                        baseDB.get("select count(*) as count from pubservice",function(err,result){		                           
		                            if(err){
		                                clearInterval(readyInterval);
		                                readyInterval=null;
		                                if(typeof callbacks == "function")callbacks(err)
		                            }else{
		                                var getUserCount=0;
		                                if(typeof pubservices  != "undefined" &&typeof pubservices.length != "undefined"){
		                                    getUserCount=pubservices.length;
		                                }
		                                console.log("已同步服务号"+result.count+" 总数:"+getUserCount+" 百分比: "+parseInt(result.count/getUserCount*100)+"%")		                               
		                                if(pubservices&&pubservices.length){       
		                                    if(result.count==beginPubserviceCount){       
		                                        clearInterval(readyInterval);
		                                        readyInterval=null;
		                                        if(typeof callbacks == "function")callbacks(null)
		                                    }else{
		                                    	beginPubserviceCount = result.count;
		                                    }
		                                }else{		                                    
		                                    clearInterval(readyInterval);
		                                    readyInterval=null;
		                                    if(typeof callbacks == "function")callbacks()
		                                }
		                            }
		                        })
	                    },400);
						}
					});
				});
			}catch(e){
	        	console.error("pubserviceSync error:"+e);
	        }
		};
	}
时间: 2024-08-07 21:17:51

node-webkit中sqlite3事务提交后事务没完成就回调的解决方案的相关文章

Hibernate 事务提交和事务回滚

Hibernate 事务提交和事务回滚 最近在用做hibernate做项目,一直不明白session.beginTransaction().commit() 和 session.beginTransaction().rollback(); 有什么区别 一组业务整体处理的行为叫一个事务.这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果.但如果一组中有任何的差错出现的话,我们就认为这事务不成功,需要回滚来撤消之前的操作.举例:你去银行转账,转账我们有两步吧,从你账户中取出钱再

关于Node.js中安装完express后不能使用express命令

楼主程后台序狗,最近在研究前台的一些东西,然后想了解下Node.js,按照搜索到的例子进行安装. 安装完express之后发现按照他的验证方法输入express -v命令验证是否安装成功,结果发现提示命令不能用 怎么办呢? 猜测是express版本更新了,但是我们不知道新版本该怎么玩了.所以我就只好先删除当前安装的express,重新安装以前的版本试试.测试ok. 此处使用的命令有 卸载: npm uninstall -g express 安装指定版本: npm install -g [emai

4.事务提交过程,事务基本概念,Oracle中的事务生命周期,保存点savepoint,数据库的隔离级别

 事务提交过程 事务 基本概念 概念:一个或者多个DML语言组成 特点:要么都成功,要么都失败 事务的隔离性:多个客户端同时操作数据库的时候,要隔离它们的操作, 否则出现:脏读  不可重复读  幻读 Oracle默认情况下,事务是打开的 commit案例: SQL> create table t1(tid int,tname varchar2(20)); 表已创建. SQL> select * from tab; TNAME                          TABTYPE

MySQL事务提交过程(一)

MySQL作为一种关系型数据库,已被广泛应用到互联网中的诸多项目中.今天我们来讨论下事务的提交过程. MySQL体系结构 由于mysql插件式存储架构,导致开启binlog后,事务提交实质是二阶段提交,通过两阶段提交,来保证存储引擎和二进制日志的一致. 本文仅讨论binlog未打卡状态下的提交流程,后续会讨论打开binlog选项后的提交逻辑. 测试环境 OS:WIN7 ENGINE: bin-log:off DB: 测试条件 set autocommit=0; -- --------------

mysql -- 事务隔离级别以及java中事务提交的步骤

SQL标准定义了四种隔离级别,不同隔离的级别使用不当会出现脏读.不可重复读和幻读的问题,隔离级别的出现是事务处理效率与安全的一种平衡. 隔离级别不同会出现的问题 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据. 幻读(Phant

Oracle 中如何手工提交Cluster Table的事务

环境中遇到了ora-00600 4000错误,涉及的对象即为cluster table,下面我这里简单模拟了一下.供参考! ++++创建测试表 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62

PHP 中mysql如何实现事务提交?

事务就是指对数据库的多次修改,要么全部成功,要么全部失败,不能出现部分修改成功,部分修改失败的情况. PHP下操作mysql数据库要实现事务提交,需注意以下方面: 1, 数据库表存储引擎类型设置为innoDB.默认的mysql表采用MYISAM引擎,是不支持事务的,因此要采用以下语句变更: mysql> alter table ‘table_name’ engine=innodb; 2,PDO对象设置要设置errmode为Exception,否则第16行SQL执行出错,语句也不会跳到catch段

mysql 事务提交过程

打开binlog选项后,执行事务提交命令时,就会进入两阶段提交模式.两阶段提交分为prepare阶段和commit两个阶段.流程如下 :这里面涉及到两个重要的参数:innodb_flush_log_at_trx_commit和sync_binlog,参数可以设置不同的值,具体可以查看mysql的帮助手册.我这里设置的是双一模式(innodb_flush_log_at_trx_commit=1,sync_binlog=1),不同的模式区别在于,写文件调用write和落盘fsync调用的频率不同,所

关于mysql事务提交

package com.itheima.trans; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.itheima.util.DBUtil; public class TransDemo { /* 创建mysql数据库相关sql语句: create database day11; u