Articles of 事务

如何使用js将大量事务发送到ethereum

我试图用一个用js编写的程序向Ethereum发送大量事务。 我使用节点js,web3和infura ropsten。 问题是:如果我一次发送交易,他们中的大多数就会消失。 试图解决这个问题,我发送间隔交易。 它工作,但非常缓慢。 我花了小时只发送100笔交易。 有没有解决scheme如何使其工作更快,更正确? 我想在前一个开始挂起之后发送交易,但我不知道该怎么做。 函数sendRaw只在一段时间后才获取交易号。 该代码读取文件,获取地址,金额和可选数据,并使用智能合约的方法转移令牌。 这是代码: function sendRaw(rawTx) { var privateKey = new Buffer(key, 'hex'); var transaction = new tx(rawTx); transaction.sign(privateKey); var serializedTx = transaction.serialize().toString('hex'); web3.eth.sendRawTransaction( '0x' + serializedTx, function(err, result) { if(err) { console.log(err); } else { console.log(result); Ntrans=result; } }); } var nonce = web3.eth.getTransactionCount(address); var gasPrice […]

与SQL服务器一起发生事务隔离级别问题

我们有一个具有Sequelize事务的函数。 在事务中,它检查数据库表行上的字段,并基于该字段返回或继续更新各种数据库表。 例如 let buyingStatus = await models.buyingFood.findOne({ where: { id: 21 }, transaction: t}); if (buyingStatus.status == 'bought') return 'already bought' 如果继续,它会更新多个地方,只有在状态不被bought时才更新,最后将状态更改为bought 。 问题是当函数被同时调用两次时。 瓶颈是select语句后发生的更新。 所以两个人可以通过没有买的购买状态,然后更新bought状态,以及所有其他更新。 不是SQL的专家,我们研究发现,locking表或更改隔离级别可以解决这个问题。 但是,我们都执行并没有帮助。 见下文 1)改变隔离级别 let t = await models.sequelize.transaction(isolationLevel: Sequelize.Transaction.ISOLATION_LEVELS.SERIALIZABLE); 2)在查找上设置locking let buyingStatus = await models.buyingFood.findOne({ where: { id: 21 }, transaction: t, lock: t.LOCK.UPDATE }); 我们想要的是从未提交的交易中读取,所以如果人A已经改变了他之前的bought状态

redis和watch + multi允许并发用户

我正在用一个web服务的相同电子邮件地址进行用户注册的负载testing,同时连接的前10个用户将始终注册。 我正在使用WATCH和MULTI,但似乎没有任何工作。 我打电话save()来保存用户。 this.insert = function(callback) { this.preInsert(); created = new Date(); updated = new Date(); // Also with these uncommented it still doesn't work // Common.client.watch("u:" + this.username); // Common.client.watch("em:" + this.email); console.log(ID + " email is locked " + this.email); Common.client.multi() .set("u:" + this.username, ID) .hmset("u:" + ID, {"username": this.username ,"password": this.password ,"email": […]

蓝鸟承诺和Sequelize模拟交易primefaces性

我正在使用bluebird.js承诺和sequelize.js来模拟我的网站上的交易。 基本上我尝试在processTransactions中做一些事情,如果一切正常,我会t.commit()事务,否则我会t.rollback()事务。 另外我正在使用bluebird.js承诺做控制stream程。 这里是代码: var processTransactions = function(transactionmain, transactionlist, t){ // code to process transactions }; var processtransaction = function(transaction_id) { // t need to be passed in so we can choose // t.commit() or t.rollback() the transaction sequelize.transaction(function(t){ return Promise.resolve({}).bind({transactionmain: […], transactionlist: […]}) .then(function(){ return [this.transactionmain, this.transactionlist, t]; }) .spread(processTransactions) .then(function(){ t.commit().success(function() {}) }) […]

续订交易冲突

我想知道一种方式来创build一个事务,而不是在其他模型之间共享,下面的代码抛出一个exception Unhandled rejection SequelizeDatabaseError: SQLITE_ERROR: cannot start a transaction within a transaction at module.exports.Query.formatError (workspace/node_modules/sequelize/lib/dialects/sqlite/query.js:239:16) at Statement.<anonymous> (workspace/node_modules/sequelize/lib/dialects/sqlite/query.js:47:31) at Statement.replacement (workspace/node_modules/sqlite3/lib/trace.js:20:31) at Statement.replacement (workspace/node_modules/sqlite3/lib/trace.js:20:31) 名称为'I will exist'的模型不能在事务上,但是继续尝试将其插入到在另一个函数上创build的事务上。 return Promise.all([ sequelize.transaction(function (transaction) { return new Promise(function (r) { setTimeout(function () { r(); }, 1000); }).then(function () { User.create({ name : 'Im out of tx' }); }); […]

Nodejs – 带有循环的node-mysql事务

我的nodejs项目目前使用node-mysql 。 我有一个多级数据数组,我想要插入到多个表中。 交易是我想到的,以实现我的目标。 以下是我的代码的大纲: const mysql = require("mysql") const pool = mysql.createPool({ // connectionLimit=10 by default connectionLimit: 5, // 10 by default host: 'somehost', user: 'userblah', password: 'passworblah', database: 'dbblah' }) pool.getConnection(function(err, dbConnection) { dbConnection.beginTransaction(function(err1) { if (err1) { console.log(“Unable to begin the transaction”) return } arrayElements.forEach(function(element) { var insert1 = mysql.format(“INSERT INTO table1(…) […]

交易mongodb

我需要使用“全部或全部”过程写入两个不同的mongodb集合。 Fyi我在后端使用NodeJs。 据我所知,MongoDb在提供单个集合时提供了primefaces性,但是当我们需要写入多个集合时,MongoDb不提供primefaces性。 所以我想知道一种在nodejs / mongodb中模拟这个事务的方法,以避免在另一个集合失败的情况下写入一个集合,并且如果第二个进程失败,也有可能进行“回滚”。 感谢你们!

与pg-promise的嵌套事务

我正在使用NodeJS,PostgreSQL和令人惊叹的pg-promise库。 就我而言,我想执行三个主要的查询: 在表格的“推文”中插入一条推文。 如果tweet中有hashtags,将它们插入到另一个表“hashtags” 他们将tweet和hashtag链接到第三个表“hashtagmap”(多对多关系表) 以下是请求正文(JSON)的示例: { "id":"12344444", "created_at":"1999-01-08 04:05:06 -8:00", "userid":"@postman", "tweet":"This is the first test from postman!", "coordinates":"", "favorite_count":"0", "retweet_count":"2", "hashtags":{ "0":{ "name":"test", "relevancetraffic":"f", "relevancedisaster":"f" }, "1":{ "name":"postman", "relevancetraffic":"f", "relevancedisaster":"f" }, "2":{ "name":"bestApp", "relevancetraffic":"f", "relevancedisaster":"f" } } 上面的所有字段都应该包含在表格“推文”之外,而标签又应该包含在表格“标签”中。 下面是我使用的代码,基于NodeJS模块中来自pg-promise文档的嵌套事务。 我想我需要嵌套事务,因为我需要知道tweet_id和hashtag_id为了链接他们在hashtagmap表中。 // Columns var tweetCols = ['id','created_at','userid','tweet','coordinates','favorite_count','retweet_count']; var hashtagCols = ['name','relevancetraffic','relevancedisaster']; //pgp Column Sets […]

在knex事务中抛出自定义错误会导致api崩溃

我目前正在与knex工作在API。 我必须在一个大事务中执行一些操作,并且必须在那里进行判断 – 如果任何validation返回“false” – 事务必须停止。 问题是,每当我抛出“我的”错误,即使所有的“Catch”ES都得到它,并且res被正确地发送 – 之后,我的整个api崩溃了: 无法读取null的属性“removeListener” 这很奇怪,因为没有类似的问题来捕捉由knex本身造成的错误。 Strangley,如果我会删除我的错误抛出 – 我仍然会得到未处理的exception 无法读取null的属性“回滚” 在代码中看起来像这样: f1(){ // (…) let noErrors = true; return global.knex .transaction((trx) => { return operation1(trx) //Knex operation returning object with parameter "correct" .then((output)=>{ if(output.correct === false) throw new Error('CustomError'); }) .then(()=>{ return operation2(trx); }) .then(()=>{ return operation3(trx); }) // (…) […]

pg-promise:在事务中的下一个查询中使用一个查询的结果

我是postgres的pg-promise的node.js,试图用2个插入按顺序进行事务。 第一个插入的结果ID应该在事务的下一个插入中使用。 如果任何查询失败,则回滚。 嵌套第二个db.none里面db.none .then()第一个db.one不会回滚第一个查询。 所以在这里使用一个交易。 我坚持在第二次使用第一个查询的结果。 这是我现在拥有的。 db.tx(function (t) { return t.sequence([ // generated using pgp.helpers.insert for singleData query t.one("INSERT INTO table(a, b) VALUES('a', 'b') RETURNING id"), t.none("INSERT INTO another_table(id, a_id) VALUES(1, <above_id>), (2, <above_id>)") ]); })… 使用pgp.helpers.insert为多数据查询生成第二个查询。 但是,想要使用以前的查询结果是不可行的。 是不是! 有没有办法从第一个INSERT获得id ie <above_id> ?