Skip to content

Commit 4e177a1

Browse files
committed
Allow rollback transaction after failure
Previously, it was not possible to rollback transaction after failure. Doing this resulted in an error. This commit turns it into a no-op. Transaction is automatically rolled back after failure in the database because failure is acknowledged by sending a RESET message. So this is just a driver API level change.
1 parent cf14dcc commit 4e177a1

File tree

5 files changed

+35
-4
lines changed

5 files changed

+35
-4
lines changed

src/v1/internal/stream-observer.js

+8
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ class StreamObserver {
113113
this._fieldKeys = [];
114114
}
115115

116+
/**
117+
* Mark this observer as if it has completed with no metadata.
118+
*/
119+
markCompleted() {
120+
this._fieldKeys = [];
121+
this._tail = {};
122+
}
123+
116124
/**
117125
* Will be called on errors.
118126
* If user-provided observer is present, pass the error

src/v1/transaction.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,7 @@ let _states = {
177177
return {result: _newDummyResult(observer, "COMMIT", {}), state: _states.FAILED};
178178
},
179179
rollback: (connectionHolder, observer) => {
180-
observer.onError({error:
181-
"Cannot rollback transaction, because previous statements in the " +
182-
"transaction has failed and the transaction has already been rolled back."});
180+
observer.markCompleted();
183181
return {result: _newDummyResult(observer, "ROLLBACK", {}), state: _states.FAILED};
184182
},
185183
run: (connectionHolder, observer, statement, parameters) => {

test/internal/stream-observer.test.js

+12
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,18 @@ describe('StreamObserver', () => {
172172
streamObserver.onCompleted({key: 42});
173173
});
174174

175+
it('should mark as completed', done => {
176+
const streamObserver = new StreamObserver();
177+
streamObserver.markCompleted();
178+
179+
streamObserver.subscribe({
180+
onCompleted: metadata => {
181+
expect(metadata).toEqual({});
182+
done();
183+
}
184+
});
185+
});
186+
175187
});
176188

177189
function newStreamObserver() {

test/v1/session.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ describe('session', () => {
114114
const session = driver.session();
115115
const tx = session.beginTransaction();
116116
tx.run('INVALID QUERY').catch(() => {
117-
tx.rollback().catch(() => {
117+
tx.rollback().then(() => {
118118
session.close(() => {
119119
driver.close();
120120
done();

test/v1/transaction.test.js

+13
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,19 @@ describe('transaction', () => {
527527
tx.rollback().then(() => done());
528528
});
529529

530+
it('should allow rollback after failure', done => {
531+
const tx = session.beginTransaction();
532+
tx.run('WRONG QUERY')
533+
.then(() => done.fail('Expected to fail'))
534+
.catch(error => {
535+
expectSyntaxError(error);
536+
537+
tx.rollback()
538+
.catch(error => done.fail(error))
539+
.then(() => done());
540+
});
541+
});
542+
530543
function expectSyntaxError(error) {
531544
expect(error.code).toBe('Neo.ClientError.Statement.SyntaxError');
532545
}

0 commit comments

Comments
 (0)