Транзакции — непростая вещь, которую можно поддерживать независимо от хранилища. Поэтому в JayData нет явного управления транзакциями, вместо этого вы можете использовать неявное поведение EntityContext «все или ничего». Что касается webSQL, каждый дельта-пакет (то есть: несколько элементов add/update
и saveChanges()
в конце) выполняется в одной и той же транзакции webSQL. Если при сохранении каких-либо элементов произойдет ошибка, все предыдущие вставки/обновления будут отменены.
Очень простой пример, демонстрирующий это в действии: следующий код вставляет два элемента в таблицу и создает сценарий ошибки дублирующего ключа. Конечным результатом является то, что в таблице не будет строк, даже если вторая вставка была отклонена из-за дублирования.
$data.Entity.extend("item", {
ID: { key: true, computed: true, type: 'int' },
data: { type: 'string' }
});
$data.EntityContext.extend("ItemsContainer", {
items: { type: $data.EntitySet, elementType: item }
});
var offlinedb = new ItemsContainer({
name: 'sqLite',
databaseName: 'itemdb'
});
function createLocalData() {
offlinedb.items.add({ data: 'apple' });
offlinedb.items.add({ data: 'orange', ID:1 });
offlinedb.saveChanges(
function () {
}
);
}
Это создает программные откаты, вы можете перехватывать обработчики событий на уровне набора и контекста и генерировать в них исключение. Подробнее читайте здесь: http://jaydata.org/blog/entitycontext-and-entityset-scoped-event-handlers-in-jaydata-1.2
person
Peter Aron Zentai
schedule
23.10.2012