Skip to content

Commit cfa200b

Browse files
committed
Changed to simple transaction support. Updated documentation to point to MySQL transaction documentation.
1 parent c8bcf89 commit cfa200b

8 files changed

+41
-119
lines changed

Readme.md

+29-36
Original file line numberDiff line numberDiff line change
@@ -703,49 +703,42 @@ connection.query(options, function(err, results) {
703703

704704
## Transactions
705705

706-
Transactions are useful when combined with pooling in cases where
707-
multiple dependent nested queries occur:
706+
Simple transaction support is available at the connection level:
708707

709708
```js
710-
var title = 'Hello MySQL';
711-
712-
pool.getConnection(function(err, connection) {
713-
connection.beginTransaction(function(err) {
714-
if (err) {
715-
connection.release();
716-
throw err;
709+
connection.beginTransaction(function(err) {
710+
if (err) { throw err; }
711+
connection.query('INSERT INTO posts SET title=?', title, function(err, result) {
712+
if (err) {
713+
connection.rollback(function() {
714+
throw err;
715+
});
717716
}
718-
connection.query('INSERT INTO posts SET title=?', title, function(err, result) {
719-
if (err) {
720-
connection.release();
721-
throw err;
722-
}
723-
724-
var log = 'Post ' + result.insertId + ' added';
725-
726-
connection.query('INSERT INTO log SET data=?', log, function(err, result) {
727-
if (err) {
728-
connection.release();
729-
throw err;
730-
}
731-
connection.commit(function(err) {
732-
if (err) {
733-
connection.release();
734-
throw err;
735-
}
736-
console.log('success!');
737-
});
717+
718+
var log = 'Post ' + result.insertId + ' added';
719+
720+
connection.query('INSERT INTO log SET data=?', log, function(err, result) {
721+
if (err) {
722+
connection.rollback(function() {
723+
throw err;
724+
});
725+
}
726+
connection.commit(function(err) {
727+
if (err) {
728+
connection.rollback(function() {
729+
throw err;
730+
});
731+
}
732+
console.log('success!');
738733
});
739-
});
734+
});
740735
});
741736
});
742737
```
743-
744-
Note that all transactions must be explicitly committed.
745-
```connection.release()``` will roll back any open
746-
transactions on the connection before releasing it.
747-
748-
```connection.rollback(function(err))``` can also be used to manually roll back queries.
738+
Please note that beginTransaction(), commit() and rollback() are simply convenience
739+
functions that execute the START TRANSACTION, COMMIT, and ROLLBACK commands respectively.
740+
It is important to understand that many commands in MySQL can cause an implicit commit,
741+
as described [in the MySQL documentation]: http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html
749742

750743
## Error handling
751744

lib/Connection.js

+10-38
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ function Connection(options) {
1717
this._protocol = new Protocol({config: this.config, connection: this});
1818
this._connectCalled = false;
1919
this.state = "disconnected";
20-
this.inTransaction = false;
2120
}
2221

2322
Connection.createQuery = function(sql, values, cb) {
@@ -95,60 +94,33 @@ Connection.prototype.changeUser = function(options, cb){
9594
database : options.database || this.config.database,
9695
charsetNumber : charsetNumber,
9796
currentConfig : this.config
98-
}, function(err) {
99-
self.inTransaction = false;
100-
return cb(err);
101-
});
97+
}, cb);
10298
};
10399

104100
Connection.prototype.beginTransaction = function(cb) {
105-
if (this.inTransaction) {
106-
return cb(new Error('Cannot begin transaction: A transaction is already open.'));
107-
}
108-
109101
this._implyConnect();
110-
111-
var self = this;
112-
var query = Connection.createQuery('BEGIN', function(err) {
113-
self.inTransaction = true;
114-
return cb(err);
115-
});
116-
102+
103+
var query = Connection.createQuery('START TRANSACTION', cb);
117104
query._connection = this;
105+
118106
return this._protocol._enqueue(query);
119107
};
120108

121109
Connection.prototype.commit = function(cb) {
122-
if (!this.inTransaction) {
123-
return cb(new Error('Cannot commit: No transaction is currently open.'));
124-
}
125-
126110
this._implyConnect();
127-
128-
var self = this;
129-
var query = Connection.createQuery('COMMIT', function(err) {
130-
self.inTransaction = false;
131-
return cb(err);
132-
});
133-
111+
112+
var query = Connection.createQuery('COMMIT', cb);
134113
query._connection = this;
114+
135115
return this._protocol._enqueue(query);
136116
};
137117

138118
Connection.prototype.rollback = function(cb) {
139-
if (!this.inTransaction) {
140-
return cb(new Error('Cannot roll back: No transaction is currently open.'));
141-
}
142-
143119
this._implyConnect();
144-
145-
var self = this;
146-
var query = Connection.createQuery('ROLLBACK', function(err) {
147-
self.inTransaction = false;
148-
return cb(err);
149-
});
150-
120+
121+
var query = Connection.createQuery('ROLLBACK', cb);
151122
query._connection = this;
123+
152124
return this._protocol._enqueue(query);
153125
};
154126

lib/Pool.js

-5
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,6 @@ Pool.prototype.getConnection = function (cb) {
6969
Pool.prototype.releaseConnection = function (connection) {
7070
var cb;
7171

72-
if (connection.inTransaction) {
73-
// We're in a transaction. Roll it back before releasing
74-
return process.nextTick(connection.rollback.bind(connection, this.releaseConnection.bind(this, connection)));
75-
}
76-
7772
if (!connection._pool) {
7873
// The connection has been removed from the pool and is no longer good.
7974
if (this._connectionQueue.length) {

test/integration/connection/test-transaction-begin-already-open.js

-13
This file was deleted.

test/integration/connection/test-transaction-commit-not-open.js

-10
This file was deleted.

test/integration/connection/test-transaction-commit.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ connection.query([
1515

1616
connection.beginTransaction(function (err) {
1717
assert.ifError(err);
18-
assert.strictEqual(connection.inTransaction, true);
19-
18+
2019
var row = {
2120
id: 1,
2221
title: 'Test row'
@@ -30,7 +29,6 @@ connection.beginTransaction(function (err) {
3029

3130
connection.query('SELECT * FROM ' + table, function(err, rows) {
3231
assert.ifError(err);
33-
assert.strictEqual(connection.inTransaction, false);
3432
connection.end();
3533
assert.equal(rows.length, 1);
3634
});

test/integration/connection/test-transaction-rollback-not-open.js

-11
This file was deleted.

test/integration/connection/test-transaction-rollback.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ connection.query([
1515

1616
connection.beginTransaction(function (err) {
1717
assert.ifError(err);
18-
assert.strictEqual(connection.inTransaction, true);
19-
18+
2019
var row = {
2120
id: 1,
2221
title: 'Test row'
@@ -30,7 +29,6 @@ connection.beginTransaction(function (err) {
3029

3130
connection.query('SELECT * FROM ' + table, function(err, rows) {
3231
assert.ifError(err);
33-
assert.strictEqual(connection.inTransaction, false);
3432
connection.end();
3533
assert.equal(rows.length, 0);
3634
});

0 commit comments

Comments
 (0)