         XCTAssertEqual(observer.willCommitCount, 1)
         XCTAssertEqual(observer.didCommitCount, 1)
         XCTAssertEqual(observer.didRollbackCount, 0)
+    }
+    
+    func testEmptyExclusiveTransactionRollback() throws {
+        let dbQueue = try makeDatabaseQueue()
+        let observer = Observer()
+        dbQueue.add(transactionObserver: observer)
+        try dbQueue.inTransaction(.exclusive) { _ in .rollback }
+        #if SQLITE_ENABLE_PREUPDATE_HOOK
+            XCTAssertEqual(observer.willChangeCount, 0)
+        #endif
+        XCTAssertEqual(observer.didChangeCount, 0)
+        XCTAssertEqual(observer.willCommitCount, 0)
+        XCTAssertEqual(observer.didCommitCount, 0)
+        XCTAssertEqual(observer.didRollbackCount, 1)
     }
     
     // MARK: - Multiple observers

        XCTAssertEqual(observer.didRollbackCount, 0)
    }
    
    func testEmptyImmediateTransaction() throws {
        let dbQueue = try makeDatabaseQueue()
        let observer = Observer()

        XCTAssertEqual(observer.didRollbackCount, 0)
    }
    
    func testEmptyImmediateTransactionRollback() throws {
        let dbQueue = try makeDatabaseQueue()
        let observer = Observer()
        dbQueue.add(transactionObserver: observer)
        try dbQueue.inTransaction(.immediate) { _ in .rollback }
        #if SQLITE_ENABLE_PREUPDATE_HOOK
            XCTAssertEqual(observer.willChangeCount, 0)
        #endif
        XCTAssertEqual(observer.didChangeCount, 0)
        XCTAssertEqual(observer.willCommitCount, 0)
        XCTAssertEqual(observer.didCommitCount, 0)
        XCTAssertEqual(observer.didRollbackCount, 1)
    }
    
    func testEmptyExclusiveTransaction() throws {
        let dbQueue = try makeDatabaseQueue()
        let observer = Observer()
