提交 32413343 authored 作者: Andrei Tokar's avatar Andrei Tokar

encapsulate Transaction.blockingMap/blockingKey

上级 c3befc2c
...@@ -137,12 +137,12 @@ public class Transaction { ...@@ -137,12 +137,12 @@ public class Transaction {
/** /**
* Map on which this transaction is blocked. * Map on which this transaction is blocked.
*/ */
MVMap<?,VersionedValue> blockingMap; private MVMap<?,VersionedValue> blockingMap;
/** /**
* Key in blockingMap on which this transaction is blocked. * Key in blockingMap on which this transaction is blocked.
*/ */
Object blockingKey; private Object blockingKey;
Transaction(TransactionStore store, int transactionId, long sequenceNum, int status, Transaction(TransactionStore store, int transactionId, long sequenceNum, int status,
...@@ -482,7 +482,10 @@ public class Transaction { ...@@ -482,7 +482,10 @@ public class Transaction {
notifyAll(); notifyAll();
} }
public boolean waitFor(Transaction toWaitFor) { public boolean waitFor(Transaction toWaitFor, MVMap<?,VersionedValue> map, Object key) {
blockingTransaction = toWaitFor;
blockingMap = map;
blockingKey = key;
if (isDeadlocked(toWaitFor)) { if (isDeadlocked(toWaitFor)) {
StringBuilder details = new StringBuilder( StringBuilder details = new StringBuilder(
String.format("Transaction %d has been chosen as a deadlock victim. Details:%n", transactionId)); String.format("Transaction %d has been chosen as a deadlock victim. Details:%n", transactionId));
...@@ -503,7 +506,6 @@ public class Transaction { ...@@ -503,7 +506,6 @@ public class Transaction {
} }
} }
blockingTransaction = toWaitFor;
try { try {
return toWaitFor.waitForThisToEnd(timeoutMillis); return toWaitFor.waitForThisToEnd(timeoutMillis);
} finally { } finally {
......
...@@ -45,7 +45,7 @@ public class TransactionMap<K, V> extends AbstractMap<K, V> { ...@@ -45,7 +45,7 @@ public class TransactionMap<K, V> extends AbstractMap<K, V> {
/** /**
* The transaction which is used for this map. * The transaction which is used for this map.
*/ */
final Transaction transaction; private final Transaction transaction;
TransactionMap(Transaction transaction, MVMap<K, VersionedValue> map) { TransactionMap(Transaction transaction, MVMap<K, VersionedValue> map) {
this.transaction = transaction; this.transaction = transaction;
...@@ -297,16 +297,12 @@ public class TransactionMap<K, V> extends AbstractMap<K, V> { ...@@ -297,16 +297,12 @@ public class TransactionMap<K, V> extends AbstractMap<K, V> {
assert decision != MVMap.Decision.REPEAT; assert decision != MVMap.Decision.REPEAT;
blockingTransaction = decisionMaker.getBlockingTransaction(); blockingTransaction = decisionMaker.getBlockingTransaction();
if (decision != MVMap.Decision.ABORT || blockingTransaction == null) { if (decision != MVMap.Decision.ABORT || blockingTransaction == null) {
transaction.blockingMap = null;
transaction.blockingKey = null;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
V res = result == null ? null : (V) result.value; V res = result == null ? null : (V) result.value;
return res; return res;
} }
decisionMaker.reset(); decisionMaker.reset();
transaction.blockingMap = map; } while (blockingTransaction.sequenceNum > sequenceNumWhenStarted || transaction.waitFor(blockingTransaction, map, key));
transaction.blockingKey = key;
} while (blockingTransaction.sequenceNum > sequenceNumWhenStarted || transaction.waitFor(blockingTransaction));
throw DataUtils.newIllegalStateException(DataUtils.ERROR_TRANSACTION_LOCKED, throw DataUtils.newIllegalStateException(DataUtils.ERROR_TRANSACTION_LOCKED,
"Map entry <{0}> with key <{1}> and value {2} is locked by tx {3} and can not be updated by tx {4}" "Map entry <{0}> with key <{1}> and value {2} is locked by tx {3} and can not be updated by tx {4}"
...@@ -668,8 +664,8 @@ public class TransactionMap<K, V> extends AbstractMap<K, V> { ...@@ -668,8 +664,8 @@ public class TransactionMap<K, V> extends AbstractMap<K, V> {
private final boolean includeAllUncommitted; private final boolean includeAllUncommitted;
private X current; private X current;
protected TMIterator(TransactionMap<K,?> transactionMap, K from, K to, boolean includeAllUncommitted) { TMIterator(TransactionMap<K,?> transactionMap, K from, K to, boolean includeAllUncommitted) {
Transaction transaction = transactionMap.transaction; Transaction transaction = transactionMap.getTransaction();
this.transactionId = transaction.transactionId; this.transactionId = transaction.transactionId;
TransactionStore store = transaction.store; TransactionStore store = transaction.store;
MVMap<K, VersionedValue> map = transactionMap.map; MVMap<K, VersionedValue> map = transactionMap.map;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论