Skip to content

Commit

Permalink
feature: solve the lock_key length problem (apache#1905)
Browse files Browse the repository at this point in the history
  • Loading branch information
zjinlei committed Dec 2, 2019
1 parent f720053 commit 34b8060
Show file tree
Hide file tree
Showing 17 changed files with 313 additions and 162 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,6 @@ public class ServerTableColumnsName {
*/
public static final String BRANCH_TABLE_RESOURCE_ID = "resource_id";

/**
* The constant branch_table column name lock_key
*/
public static final String BRANCH_TABLE_LOCK_KEY = "lock_key";

/**
* The constant branch_table column name branch_type
*/
Expand Down
11 changes: 11 additions & 0 deletions core/src/main/java/io/seata/core/lock/AbstractLocker.java
Original file line number Diff line number Diff line change
Expand Up @@ -83,4 +83,15 @@ protected String getRowKey(String resourceId, String tableName, String pk) {
public void cleanAllLocks() {

}

@Override
public boolean releaseLock(String xid, Long branchId) {
return false;
}

@Override
public boolean releaseLock(String xid, List<Long> branchIds) {
return false;
}

}
18 changes: 18 additions & 0 deletions core/src/main/java/io/seata/core/lock/Locker.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,24 @@ public interface Locker {
*/
boolean releaseLock(List<RowLock> rowLock);

/**
* Un lock boolean.
*
* @param xid the xid
* @param branchId the branchId
* @return the boolean
*/
boolean releaseLock(String xid, Long branchId);

/**
* Un lock boolean.
*
* @param xid the xid
* @param branchIds the branchIds
* @return the boolean
*/
boolean releaseLock(String xid, List<Long> branchIds);

/**
* Is lockable boolean.
*
Expand Down
20 changes: 0 additions & 20 deletions core/src/main/java/io/seata/core/store/BranchTransactionDO.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ public class BranchTransactionDO {

private String resourceId;

private String lockKey;

private String branchType;

private int status = BranchStatus.Unknown.getCode();
Expand Down Expand Up @@ -142,24 +140,6 @@ public void setResourceId(String resourceId) {
this.resourceId = resourceId;
}

/**
* Gets lock key.
*
* @return the lock key
*/
public String getLockKey() {
return lockKey;
}

/**
* Sets lock key.
*
* @param lockKey the lock key
*/
public void setLockKey(String lockKey) {
this.lockKey = lockKey;
}

/**
* Gets branch type.
*
Expand Down
4 changes: 4 additions & 0 deletions core/src/main/java/io/seata/core/store/LockStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@ public interface LockStore {
*/
boolean unLock(List<LockDO> lockDOs);

boolean unLock(String xid, Long branchId);

boolean unLock(String xid, List<Long> branchIds);

/**
* Is lockable boolean.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,52 @@ public boolean unLock(List<LockDO> lockDOs) {
return true;
}

@Override
public boolean unLock(String xid, Long branchId) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = logStoreDataSource.getConnection();
conn.setAutoCommit(true);
//batch release lock by branch
String batchDeleteSQL = LockStoreSqls.getBatchDeleteLockSqlByBranch(lockTable, dbType);
ps = conn.prepareStatement(batchDeleteSQL);
ps.setString(1, xid);
ps.setLong(2, branchId);
ps.executeUpdate();
} catch (SQLException e) {
throw new StoreException(e);
} finally {
IOUtil.close(ps, conn);
}
return true;
}

@Override
public boolean unLock(String xid, List<Long> branchIds) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = logStoreDataSource.getConnection();
conn.setAutoCommit(true);
StringJoiner sj = new StringJoiner(",");
branchIds.stream().forEach(branchId -> sj.add("?"));
//batch release lock by branch list
String batchDeleteSQL = LockStoreSqls.getBatchDeleteLockSqlByBranchs(lockTable, sj.toString(), dbType);
ps = conn.prepareStatement(batchDeleteSQL);
ps.setString(1, xid);
for (int i = 0; i < branchIds.size(); i++) {
ps.setLong(i + 2, branchIds.get(i));
}
ps.executeUpdate();
} catch (SQLException e) {
throw new StoreException(e);
} finally {
IOUtil.close(ps, conn);
}
return true;
}

@Override
public boolean isLockable(List<LockDO> lockDOs) {
Connection conn = null;
Expand Down
39 changes: 39 additions & 0 deletions core/src/main/java/io/seata/core/store/db/LockStoreSqls.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,20 @@ public class LockStoreSqls {
public static final String BATCH_DELETE_LOCK_SQL = "delete from " + LOCK_TABLE_PLACEHOLD
+ " where " + ServerTableColumnsName.LOCK_TABLE_XID + " = ? and " + ServerTableColumnsName.LOCK_TABLE_ROW_KEY + " in (" + IN_PARAMS_PLACEHOLD + ") ";

/**
* The constant BATCH_DELETE_LOCK_BY_BRANCH_SQL.
*/
public static final String BATCH_DELETE_LOCK_BY_BRANCH_SQL = "delete from " + LOCK_TABLE_PLACEHOLD
+ " where " + ServerTableColumnsName.LOCK_TABLE_XID + " = ? and " + ServerTableColumnsName.LOCK_TABLE_BRANCH_ID + " = ? ";


/**
* The constant BATCH_DELETE_LOCK_BY_BRANCHS_SQL.
*/
public static final String BATCH_DELETE_LOCK_BY_BRANCHS_SQL = "delete from " + LOCK_TABLE_PLACEHOLD
+ " where " + ServerTableColumnsName.LOCK_TABLE_XID + " = ? and " + ServerTableColumnsName.LOCK_TABLE_BRANCH_ID + " in (" + IN_PARAMS_PLACEHOLD + ") ";


/**
* The constant QUERY_LOCK_SQL.
*/
Expand Down Expand Up @@ -128,6 +142,31 @@ public static String getBatchDeleteLockSql(String lockTable, String paramPlaceHo
paramPlaceHold);
}


/**
* Get batch delete lock sql string.
*
* @param lockTable the lock table
* @param dbType the db type
* @return the string
*/
public static String getBatchDeleteLockSqlByBranch(String lockTable, String dbType) {
return BATCH_DELETE_LOCK_BY_BRANCH_SQL.replace(LOCK_TABLE_PLACEHOLD, lockTable);
}

/**
* Get batch delete lock sql string.
*
* @param lockTable the lock table
* @param paramPlaceHold the param place hold
* @param dbType the db type
* @return the string
*/
public static String getBatchDeleteLockSqlByBranchs(String lockTable, String paramPlaceHold, String dbType) {
return BATCH_DELETE_LOCK_BY_BRANCHS_SQL.replace(LOCK_TABLE_PLACEHOLD, lockTable).replace(IN_PARAMS_PLACEHOLD,
paramPlaceHold);
}

/**
* Get query lock sql string.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -339,11 +339,10 @@ public boolean insertBranchTransactionDO(BranchTransactionDO branchTransactionDO
ps.setLong(3, branchTransactionDO.getBranchId());
ps.setString(4, branchTransactionDO.getResourceGroupId());
ps.setString(5, branchTransactionDO.getResourceId());
ps.setString(6, branchTransactionDO.getLockKey());
ps.setString(7, branchTransactionDO.getBranchType());
ps.setInt(8, branchTransactionDO.getStatus());
ps.setString(9, branchTransactionDO.getClientId());
ps.setString(10, branchTransactionDO.getApplicationData());
ps.setString(6, branchTransactionDO.getBranchType());
ps.setInt(7, branchTransactionDO.getStatus());
ps.setString(8, branchTransactionDO.getClientId());
ps.setString(9, branchTransactionDO.getApplicationData());
return ps.executeUpdate() > 0;
} catch (SQLException e) {
throw new StoreException(e);
Expand Down Expand Up @@ -448,7 +447,6 @@ private BranchTransactionDO convertBranchTransactionDO(ResultSet rs) throws SQLE
branchTransactionDO.setStatus(rs.getInt(ServerTableColumnsName.BRANCH_TABLE_STATUS));
branchTransactionDO.setApplicationData(rs.getString(ServerTableColumnsName.BRANCH_TABLE_APPLICATION_DATA));
branchTransactionDO.setClientId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_CLIENT_ID));
branchTransactionDO.setLockKey(rs.getString(ServerTableColumnsName.BRANCH_TABLE_LOCK_KEY));
branchTransactionDO.setXid(rs.getString(ServerTableColumnsName.BRANCH_TABLE_XID));
branchTransactionDO.setResourceId(rs.getString(ServerTableColumnsName.BRANCH_TABLE_RESOURCE_ID));
branchTransactionDO.setBranchId(rs.getLong(ServerTableColumnsName.BRANCH_TABLE_BRANCH_ID));
Expand Down
6 changes: 3 additions & 3 deletions core/src/main/java/io/seata/core/store/db/LogStoreSqls.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public class LogStoreSqls {
protected static final String ALL_BRANCH_COLUMNS
= ServerTableColumnsName.BRANCH_TABLE_XID + ", " + ServerTableColumnsName.BRANCH_TABLE_TRANSACTION_ID + ", "
+ ServerTableColumnsName.BRANCH_TABLE_BRANCH_ID + ", " + ServerTableColumnsName.BRANCH_TABLE_RESOURCE_GROUP_ID + ", "
+ ServerTableColumnsName.BRANCH_TABLE_RESOURCE_ID + ", " + ServerTableColumnsName.BRANCH_TABLE_LOCK_KEY + ", "
+ ServerTableColumnsName.BRANCH_TABLE_RESOURCE_ID + ", "
+ ServerTableColumnsName.BRANCH_TABLE_BRANCH_TYPE + ", " + ServerTableColumnsName.BRANCH_TABLE_STATUS + ", "
+ ServerTableColumnsName.BRANCH_TABLE_CLIENT_ID + ", " + ServerTableColumnsName.BRANCH_TABLE_APPLICATION_DATA + ", "
+ ServerTableColumnsName.BRANCH_TABLE_GMT_CREATE + ", " + ServerTableColumnsName.BRANCH_TABLE_GMT_MODIFIED;
Expand Down Expand Up @@ -143,14 +143,14 @@ public class LogStoreSqls {
*/
public static final String INSERT_BRANCH_TRANSACTION_MYSQL = "insert into " + BRANCH_TABLE_PLACEHOLD + "("
+ ALL_BRANCH_COLUMNS + ")" +
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, now(), now())";
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, now(), now())";

/**
* The constant INSERT_BRANCH_TRANSACTION_ORACLE.
*/
public static final String INSERT_BRANCH_TRANSACTION_ORACLE = "insert into " + BRANCH_TABLE_PLACEHOLD + "("
+ ALL_BRANCH_COLUMNS + ")" +
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, sysdate, sysdate)";
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, sysdate, sysdate)";

/**
* The constant UPDATE_BRANCH_TRANSACTION_STATUS_MYSQL.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,6 @@ public void queryBranchTransactionDO() throws SQLException {
branchTransactionDO.setBranchId(345465676);
branchTransactionDO.setBranchType("TCC");
branchTransactionDO.setResourceGroupId("abc");
branchTransactionDO.setLockKey("t:1,2,3;t2,4,5,6");
branchTransactionDO.setResourceGroupId("a");
branchTransactionDO.setClientId("1.1.1.1");
branchTransactionDO.setStatus(1);
Expand All @@ -464,7 +463,6 @@ public void queryBranchTransactionDO() throws SQLException {
branchTransactionDO.setBranchId(78563453);
branchTransactionDO.setBranchType("TCC");
branchTransactionDO.setResourceGroupId("abc");
branchTransactionDO.setLockKey("t:6;t2:7");
branchTransactionDO.setResourceGroupId("a");
branchTransactionDO.setClientId("1.1.1.1");
branchTransactionDO.setStatus(1);
Expand Down Expand Up @@ -508,7 +506,6 @@ public void insertBranchTransactionDO() throws SQLException {
branchTransactionDO.setBranchId(1234508);
branchTransactionDO.setBranchType("TCC");
branchTransactionDO.setResourceGroupId("abc");
branchTransactionDO.setLockKey("t:1,2,3;t2,4,5,6");
branchTransactionDO.setResourceGroupId("a");
branchTransactionDO.setClientId("1.1.1.1");
branchTransactionDO.setStatus(1);
Expand Down Expand Up @@ -548,7 +545,6 @@ public void updateBranchTransactionDO() throws SQLException {
branchTransactionDO.setBranchId(343434318);
branchTransactionDO.setBranchType("TCC");
branchTransactionDO.setResourceGroupId("abc");
branchTransactionDO.setLockKey("t:1,2,3;t2,4,5,6");
branchTransactionDO.setResourceGroupId("a");
branchTransactionDO.setClientId("1.1.1.1");
branchTransactionDO.setStatus(1);
Expand Down Expand Up @@ -590,7 +586,6 @@ public void deleteBranchTransactionDO() throws SQLException {
branchTransactionDO.setBranchId(34567798);
branchTransactionDO.setBranchType("TCC");
branchTransactionDO.setResourceGroupId("abc");
branchTransactionDO.setLockKey("t:1,2,3;t2,4,5,6");
branchTransactionDO.setResourceGroupId("a");
branchTransactionDO.setClientId("1.1.1.1");
branchTransactionDO.setStatus(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@
import java.util.List;

import io.seata.common.XID;
import io.seata.common.util.CollectionUtils;
import io.seata.common.util.StringUtils;
import io.seata.core.exception.TransactionException;
import io.seata.core.lock.Locker;
import io.seata.core.lock.RowLock;
import io.seata.server.session.BranchSession;
import org.slf4j.Logger;
Expand All @@ -29,7 +32,6 @@
* The type Abstract lock manager.
*
* @author zhangsen
* @data 2019 /4/25
*/
public abstract class AbstractLockManager implements LockManager {

Expand All @@ -38,6 +40,75 @@ public abstract class AbstractLockManager implements LockManager {
*/
protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractLockManager.class);

@Override
public boolean acquireLock(BranchSession branchSession) throws TransactionException {
if (branchSession == null) {
throw new IllegalArgumentException("branchSession can't be null for memory/file locker.");
}
String lockKey = branchSession.getLockKey();
if (StringUtils.isNullOrEmpty(lockKey)) {
//no lock
return true;
}
//get locks of branch
List<RowLock> locks = collectRowLocks(branchSession);
if (CollectionUtils.isEmpty(locks)) {
//no lock
return true;
}
return getLocker(branchSession).acquireLock(locks);
}

@Override
public boolean releaseLock(BranchSession branchSession) throws TransactionException {
if (branchSession == null) {
throw new IllegalArgumentException("branchSession can't be null for memory/file locker.");
}
List<RowLock> locks = collectRowLocks(branchSession);
try {
return getLocker(branchSession).releaseLock(locks);
} catch (Exception t) {
LOGGER.error("unLock error, branchSession:{}", branchSession, t);
return false;
}
}

@Override
public boolean isLockable(String xid, String resourceId, String lockKey) throws TransactionException {
List<RowLock> locks = collectRowLocks(lockKey, resourceId, xid);
try {
return getLocker().isLockable(locks);
} catch (Exception t) {
LOGGER.error("isLockable error, xid:{} resourceId:{}, lockKey:{}", xid, resourceId, lockKey, t);
return false;
}
}


@Override
public void cleanAllLocks() throws TransactionException {
getLocker().cleanAllLocks();
}

/**
* Gets locker.
*
* @return the locker
*/
protected Locker getLocker() {
return getLocker(null);
}

/**
* Gets locker.
*
* @param branchSession the branch session
* @return the locker
*/
protected Locker getLocker(BranchSession branchSession) {
return LockerFactory.get(branchSession);
}

/**
* Collect row locks list.`
*
Expand Down
Loading

0 comments on commit 34b8060

Please sign in to comment.