我有一台带有Sqlite3数据库的服务器和一台客户端PC。
如果通过ajax发送数据库查询,如果查询已完成,我会在查询结果中收到真实结果。
我的问题是:如果我在进行数据库查询时关闭了我的服务器,我可能会收到一个假的正面,因为查询已完成但未在硬盘内存中修复!
示例:
通过ajax:
var testo_query='INSERT INTO comanda terminale,perc_iva,id,cod_articolo,ordinamento,peso_ums,ultima_portata,numero_conto,nodo,cat_variante,dest_stampa,portata,desc_art,quantita,prezzo_un,categoria,ntav_comanda,operatore,tipo_record,stato_record, prog_inser,posizione) VALUES ("null","22","DAV_20160629110600158","151","00","","","1","006","1","51","4","TARTUFO NOCCIOLA","1","5.00",
var dbtype='sqlite';
var dbname='provaINTELLINET.sqlite';
"0","A5","DAVIDE","CORPO","ATTIVO","6","CONTO");';
$.ajax({
type: "POST",
async: true,
url: comanda.url_server + 'classi_php/db_realtime_cassa.lib.php',
data: {
type: dbtype,
db_name: dbname,
query: testo_query
},
dataType: "json",
timeout: 10000,
success: function (dati) {
console.log("QUERY_CASSA_SUCCESS", dati);
//I RECEIVE A "TRUE" RESULT HERE
}
}
});`
那是服务器端:
<?php
//header('Access-Control-Allow-Origin: *');
// IMPORTANTE !!
//Se non faccio così, ai warning mi da error e ripete due volte la sincronia
error_reporting(0);
$sql = $_POST['query'];
//MYSQL
@$host = $_REQUEST['db_host'];
@$user = $_REQUEST['db_user'];
@$paas = $_REQUEST['db_pass'];
$db_name = $_REQUEST['db_name'];
$db_type = $_REQUEST['type'];
$prefix = '../';
$db2 = null;
if ($db_type === 'mysql') {
$db2 = new mysqli($host, $user, $pass, $db_name);
} else {
$db2 = new SQLite3($prefix . $db_name);
}
$result = false;
$i = 0;
while ($result === false && $i < 10) {
$ms = "0." . rand(6, 9);
sleep($ms);
$result = $db2->query($sql);
if ($result !== false) {
$risultato_booleano = "true";
break;
}
$risultato_booleano = "false";
$i++;
}
if (strpos(strtolower($sql), 'select') === false) {
$db2->close();
} else {
if ($db_type === 'mysql') {
for ($i = 1; $riga = $result->fetch_assoc(); $i++) {
$prodotti[$i] = $riga;
}
} else {
for ($i = 1; $riga = $result->fetchArray(SQLITE3_ASSOC); $i++) {
$prodotti[$i] = $riga;
}
}
}
$db2->close();
if (@json_encode($prodotti) !== null && @json_encode($prodotti) !== 'null') {
echo json_encode($prodotti);
} else {
echo $risultato_booleano;
}
为什么?
答案 0 :(得分:0)
我不知道你的意思是误报&#39;但SQLite具有非常强大的ACID支持。您可以(非常详细地)阅读Atomic Commit in SQLite中如何实现这一点。
要从中受益,您必须使用transactions:
// start a transaction.
$db2->exec('BEGIN');
... insert/update/delete/etc. ...
// commit transaction.
$db2->exec('COMMIT');
// - OR - discard transaction.
$db2->exec('ROLLBACK');