Обновил списочек новыми на мой взгляд полезными плагинами.
gulp-git — для работы с git
// Run git commit
// src are the files to commit (or ./*)
gulp.task('commit', function(){
return gulp.src('./git-test/*')
.pipe(git.commit('initial commit'));
});
gulp-changed — обработка только измененых файлов
gulp.task('default', function () {
return gulp.src(SRC)
.pipe(changed(DEST))
// ngAnnotate will only get the files that
// changed since the last time it was run
.pipe(ngAnnotate())
.pipe(gulp.dest(DEST));
});
Задача транзакций создать строгую целостность информации. Транзакции обеспечивают гарантию того, что незаконченные обновления или искаженные действия не будут фиксироваться в базе данных; серверу предоставляется возможность выполнить автоматический откат, и база данных будет сохранена.
Создадим таблицу balance
CREATE TABLE `balance` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`action` varchar(255) NOT NULL,
`val` int(11) NOT NULL,
`total` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Проверяем вставку без транзакции
Тест транзакций MySQL 5.6
'+', 'val' => 10 );
$action[] = array( 'act' => '+', 'val' => 20 );
$action[] = array( 'act' => '-', 'val' => 5 );
$action[] = array( 'act' => '+', 'val' => 10 );
$i = 0;
// БЕЗ ТРАНЗАКЦИЙ
foreach ( $action as $key => $value ) {
$i ++;
// имитируем долгое выполнение на 2-ой вставке ( при этом сервер выключаю )
if ( $i == 2 ) sleep(20);
// получить последний total
$row = mysqli_fetch_assoc($db->query("SELECT total FROM balance ORDER BY id DESC LIMIT 1"));
$total = $row['total'];
$db->query("
INSERT INTO
balance
SET
action = '{$value['act']}',
val = {$value['val']},
total = $total {$value['act']} {$value['val']}
");
print_r($value);
}
echo ' - запросы выполнены';
$db->close();
// Резльтат: выключив на паузе mysql, вставилось в таблицу balance одна запись - целостность нарушена ( в реальной жизни это могло бы например значить, что у кого-то деньги с баланса сняли, а кому-то зачислить не успели из за сбоя)
Проверяем вставку с транзакцией
Тест транзакций MySQL 5.6
'+', 'val' => 10 );
$action[] = array( 'act' => '+', 'val' => 20 );
$action[] = array( 'act' => '-', 'val' => 5 );
$action[] = array( 'act' => '+', 'val' => 10 );
$i = 0;
// С ТРАНЗАКЦИЕЙ
$db->autocommit(FALSE);
foreach ( $action as $key => $value ) {
$i ++;
// имитируем долгое выполнение на 2-ой вставке (выключаем mysql принудительно)
if ( $i == 2 ) sleep(20);
// получить последний total
$row = mysqli_fetch_assoc($db->query("SELECT total FROM balance ORDER BY id DESC LIMIT 1"));
$total = $row['total'];
$db->query("
INSERT INTO
balance
SET
action = '{$value['act']}',
val = {$value['val']},
total = $total {$value['act']} {$value['val']}
");
print_r($value);
}
if ( ! $db->commit() ) {
$db->rollback();
echo ' - возникла ошибка откат запросов';
die();
}
echo ' - запросы выполнены';
$db->close();
// Результат: выключив mysql коммит не срабатывает и ни один запрос из транзакции не добавляется в бд. Целостность не нарушена ( в реальной жизни это могло бы например значить, что у кого-то деньги с баланса сняли, произошел сбой, но так как commit не выполнился, то rollback откатывает до начального состояния). COMMIT - для записи изменений на диск. ROLLBACK - игнорирует изменения, произведенные с начала транзакции.
http://www.querymongo.com/ - онлайн сервис преобразует sql select в mongo select (если запрос чуть сложнее обычного сразу использует reduce, я же предпочитаю использовать aggregate)