transaction.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. 'use strict'
  2. const debug = require('debug')('mssql:msv8')
  3. const BaseTransaction = require('../base/transaction')
  4. const { IDS } = require('../utils')
  5. const Request = require('./request')
  6. const ISOLATION_LEVEL = require('../isolationlevel')
  7. const TransactionError = require('../error/transaction-error')
  8. const isolationLevelDeclaration = function (type) {
  9. switch (type) {
  10. case ISOLATION_LEVEL.READ_UNCOMMITTED: return 'READ UNCOMMITTED'
  11. case ISOLATION_LEVEL.READ_COMMITTED: return 'READ COMMITTED'
  12. case ISOLATION_LEVEL.REPEATABLE_READ: return 'REPEATABLE READ'
  13. case ISOLATION_LEVEL.SERIALIZABLE: return 'SERIALIZABLE'
  14. case ISOLATION_LEVEL.SNAPSHOT: return 'SNAPSHOT'
  15. default: throw new TransactionError('Invalid isolation level.')
  16. }
  17. }
  18. class Transaction extends BaseTransaction {
  19. _begin (isolationLevel, callback) {
  20. super._begin(isolationLevel, err => {
  21. if (err) return callback(err)
  22. debug('transaction(%d): begin', IDS.get(this))
  23. this.parent.acquire(this, (err, connection, config) => {
  24. if (err) return callback(err)
  25. this._acquiredConnection = connection
  26. this._acquiredConfig = config
  27. const req = new Request(this)
  28. req.stream = false
  29. req.query(`set transaction isolation level ${isolationLevelDeclaration(this.isolationLevel)};begin tran;`, err => {
  30. if (err) {
  31. this.parent.release(this._acquiredConnection)
  32. this._acquiredConnection = null
  33. this._acquiredConfig = null
  34. return callback(err)
  35. }
  36. debug('transaction(%d): begun', IDS.get(this))
  37. callback(null)
  38. })
  39. })
  40. })
  41. }
  42. _commit (callback) {
  43. super._commit(err => {
  44. if (err) return callback(err)
  45. debug('transaction(%d): commit', IDS.get(this))
  46. const req = new Request(this)
  47. req.stream = false
  48. req.query('commit tran', err => {
  49. if (err) err = new TransactionError(err)
  50. this.parent.release(this._acquiredConnection)
  51. this._acquiredConnection = null
  52. this._acquiredConfig = null
  53. if (!err) debug('transaction(%d): commited', IDS.get(this))
  54. callback(null)
  55. })
  56. })
  57. }
  58. _rollback (callback) {
  59. super._commit(err => {
  60. if (err) return callback(err)
  61. debug('transaction(%d): rollback', IDS.get(this))
  62. const req = new Request(this)
  63. req.stream = false
  64. req.query('rollback tran', err => {
  65. if (err) err = new TransactionError(err)
  66. this.parent.release(this._acquiredConnection)
  67. this._acquiredConnection = null
  68. this._acquiredConfig = null
  69. if (!err) debug('transaction(%d): rolled back', IDS.get(this))
  70. callback(null)
  71. })
  72. })
  73. }
  74. }
  75. module.exports = Transaction