Index: forgon-tools/src/main/java/com/forgon/system/concurrent/service/OptimisticLockManager.java =================================================================== diff -u -r23800 -r25255 --- forgon-tools/src/main/java/com/forgon/system/concurrent/service/OptimisticLockManager.java (.../OptimisticLockManager.java) (revision 23800) +++ forgon-tools/src/main/java/com/forgon/system/concurrent/service/OptimisticLockManager.java (.../OptimisticLockManager.java) (revision 25255) @@ -56,6 +56,28 @@ } entityLocksInfo.requestLockById(id); } + +// public void requestLock(String entity, String rowId,String colId) { +// +// EntityLocksInfo entityLocksInfo = entityToLocksMap.get(entity); +// +// if (entityLocksInfo == null) { +// EntityLocksInfo newEntityLocksInfo = new EntityLocksInfo(entity); +// entityLocksInfo = entityToLocksMap.putIfAbsent(entity, +// newEntityLocksInfo); +// if (entityLocksInfo == null) { +// entityLocksInfo = newEntityLocksInfo; +// } +// } +// +// entityLocksInfo.requestLock(rowId,colId); +// } +// +// public void requestLock(String entity, Collection rowIds,String colId) { +// for (String rowId : rowIds) { +// requestLock(entity, rowId, colId); +// } +// } public void requestLockByLongIds(String entity, Collection ids) { if (entity == null || CollectionUtils.isEmpty(ids)) { Index: forgon-tools/src/main/java/com/forgon/system/concurrent/model/RowLocksInfo.java =================================================================== diff -u --- forgon-tools/src/main/java/com/forgon/system/concurrent/model/RowLocksInfo.java (revision 0) +++ forgon-tools/src/main/java/com/forgon/system/concurrent/model/RowLocksInfo.java (revision 25255) @@ -0,0 +1,70 @@ +/** + * + */ +package com.forgon.system.concurrent.model; + +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import com.forgon.system.transaction.model.TransactionInfo; +import com.forgon.system.transaction.util.TransactionUtils; + +/** + * @author dandan 2018年7月17日 下午4:12:07 + * + */ +public class RowLocksInfo { + + private String colId; + private ConcurrentHashMap colIdToLockMap = new ConcurrentHashMap(); + + public void requestLock(String colId) { + TransactionInfo transactionInfo = TransactionUtils + .currentTransactionInfo(); + if (transactionInfo == null) { + throw new OptimisticLockNoTransactionException(); + } + OptimisticLock existingOptimisticLock = colIdToLockMap.get(colId); + if (existingOptimisticLock == null) { + OptimisticLock newOptimisticLock = new OptimisticLock(); + newOptimisticLock.setId(colId); + newOptimisticLock.setTransactionInfo(transactionInfo); + + existingOptimisticLock = colIdToLockMap.putIfAbsent(colId, + newOptimisticLock); + if (existingOptimisticLock == null) { + transactionInfo.addLock(newOptimisticLock); + } + } + if (existingOptimisticLock != null) { + if (existingOptimisticLock.getTransactionInfo() != transactionInfo) { + throw new OptimisticLockConflictException(colId, + transactionInfo); + } + } + + } + + public void releaseTransactionLocks(TransactionInfo transactionInfo) { + List locks = transactionInfo.getLocks(); + if (locks != null) { + for (OptimisticLock optimisticLock : locks) { + colIdToLockMap.remove(optimisticLock.getId()); + } + } + } + + public RowLocksInfo(String colId) { + super(); + this.colId = colId; + } + + public String getColId() { + return colId; + } + + public void setColId(String colId) { + this.colId = colId; + } + +} Index: forgon-tools/src/main/java/com/forgon/system/concurrent/model/EntityLocksInfo.java =================================================================== diff -u -r23797 -r25255 --- forgon-tools/src/main/java/com/forgon/system/concurrent/model/EntityLocksInfo.java (.../EntityLocksInfo.java) (revision 23797) +++ forgon-tools/src/main/java/com/forgon/system/concurrent/model/EntityLocksInfo.java (.../EntityLocksInfo.java) (revision 25255) @@ -18,6 +18,8 @@ private String entity; private ConcurrentHashMap idToLockMap = new ConcurrentHashMap(); + + private ConcurrentHashMap idToRowLocksInfoMap = new ConcurrentHashMap(); // @Override // public int hashCode() { @@ -62,7 +64,26 @@ } } + + public void requestLock(String rowId, String colId) { + TransactionInfo transactionInfo = TransactionUtils + .currentTransactionInfo(); + if (transactionInfo == null) { + throw new OptimisticLockNoTransactionException(); + } + RowLocksInfo rowLocksInfo = idToRowLocksInfoMap.get(rowId); + if (rowLocksInfo == null) { + RowLocksInfo newRowLocksInfo = new RowLocksInfo(entity); + rowLocksInfo = idToRowLocksInfoMap.putIfAbsent(rowId, + newRowLocksInfo); + if (rowLocksInfo == null) { + rowLocksInfo = newRowLocksInfo; + } + } + rowLocksInfo.requestLock(colId); + } + public void releaseTransactionLocks(TransactionInfo transactionInfo) { List locks = transactionInfo.getLocks(); if (locks != null) {