| 1651 | } |
| 1652 | |
| 1653 | Transaction* Transaction::getTransaction(thread_db* tdbb, Connection* conn, TraScope tra_scope) |
| 1654 | { |
| 1655 | jrd_tra* tran = tdbb->getTransaction(); |
| 1656 | Transaction* ext_tran = conn->findTransaction(tdbb, tra_scope); |
| 1657 | |
| 1658 | if (!ext_tran) |
| 1659 | { |
| 1660 | ext_tran = conn->createTransaction(); |
| 1661 | |
| 1662 | TraModes traMode = traConcurrency; |
| 1663 | if (tran->tra_flags & TRA_read_committed) |
| 1664 | { |
| 1665 | if (tran->tra_flags & TRA_read_consistency) |
| 1666 | traMode = traReadCommitedReadConsistency; |
| 1667 | else if (tran->tra_flags & TRA_rec_version) |
| 1668 | traMode = traReadCommitedRecVersions; |
| 1669 | else |
| 1670 | traMode = traReadCommited; |
| 1671 | } |
| 1672 | else if (tran->tra_flags & TRA_degree3) { |
| 1673 | traMode = traConsistency; |
| 1674 | } |
| 1675 | |
| 1676 | try { |
| 1677 | ext_tran->start(tdbb, |
| 1678 | tra_scope, |
| 1679 | traMode, |
| 1680 | tran->tra_flags & TRA_readonly, |
| 1681 | tran->getLockWait() != 0, |
| 1682 | -tran->getLockWait() |
| 1683 | ); |
| 1684 | } |
| 1685 | catch (const Exception&) |
| 1686 | { |
| 1687 | conn->deleteTransaction(tdbb, ext_tran); |
| 1688 | throw; |
| 1689 | } |
| 1690 | } |
| 1691 | |
| 1692 | return ext_tran; |
| 1693 | } |
| 1694 | |
| 1695 | void Transaction::detachFromJrdTran() |
| 1696 | { |
no test coverage detected