The spec currently requires that IDBTransaction.objectStore() and IDBObjectStore.index() are callable after the containing transaction has finished. Since the "child" objects (IDBObjectStore and IDBIndex, respectively) contain references to the parent object, this complicates lifecycle management of these objects for implementations.
The implementation requirements could be simplified by specifying that these methods throw InvalidStateError once the transaction is finished. Alternately, the spec could be to throw TransactionInactiveError if the transaction is not active, much like the get() methods.

Each method already currently has the following exception and description:
**InvalidStateError
**Occurs if a request is made on a source object that has been deleted or removed.
Please let me know if I am misreading this and you're asking for something else.
Thanks,
Eliot

It's not clear that clause covers the case this issue is discussing. Here's a snippet:
var trans = db.transaction("store");
var store = trans.objectStore("store");
// do something useful with store
trans.oncomplete = function() {
var store = trans.objectStore("store");
// this issue is requesting that the above line should throw
};
In this case, it does not seem that the phrase "a source object that has been deleted or removed" applies.

The trivial change would be:
For IDBTransaction.objectStore(): "Occurs if a request is made on a source object that has been deleted or removed, or if the transaction has finished."
For IDBObjectStore.index(): "Occurs if a request is made on a source object that has been deleted or removed, or if the transaction the object store belongs to has finished."
I assume the "deleted or removed" phrasing - used globally in the spec - applies to cases where the IDBDatabase has been deleted or the IDBObjectStore has been deleted within a VERSION_CHANGE transaction.