我有一个函数,是递减用户信用的firebase实时数据库值与事务。正如Firebase事务API调用中所建议的,当前数据为空事务当前值偶尔返回为空。
function charge(cost, description) {
return new Promise((resolve, reject) => {
const creditRef = db.ref(`credits/${userid}`)
ref.transaction(function(current) {
console.log(`${description} current value: ${current}`)
if (current === null) {
console.log(`${description} returns 0 `)
return 0
}
if (cost > current || current === 0) {
//not enough credits return without committing
console.log(`${description} aborts `)
return
}
//commit the new credit value
console.log(`${description} returns ${current} - ${cost}`)
return current - cost
},
(error, commited, snapshot) => {
if (error) {
reject(error)
}
else {
if (commited) {
//user has enough credits
resolve()
}
else {
//not enough credits
reject('no commit')
}
}
})
}
// User has 5 credits
charge(3, 'first call').then(() => console.log('first call success')
// transaction function returns 0 since current value is null
charge(2, 'second call').then(() => console.log('second call success')
第二次调用当前值:0
第二次调用中止
首次调用电流值:5
第一次呼叫返回5-3
首次呼叫成功
第二次调用不提交
因此,当用户有足够的信用时,第二个收费电话最终没有通过。处理firebase事务空值情况的正确方法是什么?
const ref = firebase.database().ref(`59571450`)
function charge(cost, description) {
return new Promise((resolve, reject) => {
ref.transaction(function(current) {
console.log(`${description} current value: ${current}`);
if (current === null) {
console.log(`${description} returns null`)
return null;
}
if (cost > current) {
//not enough credits return without committing
console.log(`${description} aborts `)
return
}
//commit the new credit value
console.log(`${description} returns ${current} - ${cost}`)
return current - cost
},
(error, commited, snapshot) => {
if (error) {
reject(error)
}
else {
if (commited) {
//user has enough credits
resolve()
}
else {
//not enough credits
reject('no commit')
}
}
});
});
}
ref.set(5).then(() => {
charge(3, 'first call').then(() => console.log('first call success'))
charge(2, 'second call').then(() => console.log('second call success'))
})
第二次呼叫成功
有关此代码的工作版本,请参见:https://jsbin.com/xefebul/1/edit?js,console
我有一个可以监听Firebase实时数据库中的任何值更改。在线模式下,一切正常。 但在脱机模式下,设备处于脱机状态,我的Web服务器在Firebase实时数据库上完成了多个事务,其值与我从Android中输入的侦听器的值相同。设备联机后,它将只侦听最后一个事务,并跳过其间完成的其他事务。 PFB参考链接。到目前为止我已经完成的PFB代码:
问题内容: 我们有一个用于生成唯一数字键的表。这些键然后用作其他表中的PrimaryKey。表结构是这样的: 所以我们在这个表中有数据 所以,当我们需要下一个主键表中我们可以得到从这个表,其中是,它会给我们400,我们的增量(400 + 1),它和我们更新表也是这个关键。所以我们现在是401。 我们用于此目的的sql是: SQL1: 我的问题是,是否需要锁定表,以便如果多个用户同时调用此键,则键可
当使用事务处理时,需要创建 Session 对象。在进行事务处理时,可以混用 ORM 方法和 RAW 方法,如下代码所示: func MyTransactionOps() error { session := engine.NewSession() defer session.Close() // add Begin() before any action
启动事务 $this->db->start(); Swoole::$php->db('slave2')->start(); 提交事务 $this->db->commit(); Swoole::$php->db('slave2')->commit(); 回滚事务 $this->db->rollback(); Swoole::$php->db('slave2')->rollback();
在2.0.0之后我们已经支持事务嵌套了,是通过事务等级去实现的。 1. 开始事务 $model->beginTransaction(); 2. 事务提交 $model->commit(); 3. 事务回滚 $model->rollback();
事务处理(transaction processing) 可以用来维护数据的完整性,保证SQL的操作要么完全执行,要么完全不执行,如果发生错误就进行撤销。 保证数据的完整性。 保证数据不受外影响。 事务处理的几道术语 事务(transaction) 一组SQL语句 退回(rollback)撤销执行SQL语句的过程 提交(commit) 将为执行的SQL语句写入数据库表 保留点(savepoint)