Merge remote-tracking branch 'origin/main'

This commit is contained in:
Suomm 2023-11-12 10:37:39 +08:00
commit d84427dd37
7 changed files with 47 additions and 7 deletions

View File

@ -98,6 +98,13 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-annotation</artifactId>
<version>1.7.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.mybatis;
import com.mybatisflex.core.util.StringUtil;
import org.apache.ibatis.annotations.AutomapConstructor;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.binding.MapperMethod.ParamMap;
@ -767,7 +768,8 @@ public class FlexDefaultResultSetHandler extends DefaultResultSetHandler {
List<Object> constructorArgs, Constructor<?> constructor, boolean foundValues) throws SQLException {
for (int i = 0; i < constructor.getParameterTypes().length; i++) {
Class<?> parameterType = constructor.getParameterTypes()[i];
String columnName = rsw.getColumnNames().get(i);
Parameter parameter = constructor.getParameters()[i];
String columnName = StringUtil.camelToUnderline(parameter.getName());
TypeHandler<?> typeHandler = rsw.getTypeHandler(parameterType, columnName);
Object value = typeHandler.getResult(rsw.getResultSet(), columnName);
constructorArgTypes.add(parameterType);

View File

@ -70,7 +70,7 @@ public class MapperInvocationHandler implements InvocationHandler {
//最终通过数据源 自定义分片 策略去获取
String shardingDataSourceKey = DataSourceKey.getByShardingStrategy(dataSourceKey, proxy, method, args);
if (shardingDataSourceKey != null && !shardingDataSourceKey.equals(dataSourceKey)) {
DataSourceKey.use(dataSourceKey);
DataSourceKey.use(shardingDataSourceKey);
needClearDsKey = true;
}

View File

@ -22,7 +22,7 @@
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-annotation</artifactId>
<version>${mybatis-flex.version}</version>
<version>1.7.3</version>
</dependency>
</dependencies>

View File

@ -101,6 +101,12 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-core</artifactId>
<version>1.7.3</version>
</dependency>
</dependencies>
<build>

View File

@ -18,6 +18,7 @@ package com.mybatisflex.spring;
import com.mybatisflex.core.transaction.TransactionContext;
import com.mybatisflex.core.transaction.TransactionalManager;
import com.mybatisflex.core.util.StringUtil;
import org.springframework.jdbc.datasource.JdbcTransactionObjectSupport;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
@ -63,23 +64,29 @@ public class FlexTransactionManager extends AbstractPlatformTransactionManager {
protected void doCommit(DefaultTransactionStatus status) throws TransactionException {
TransactionObject transactionObject = (TransactionObject) status.getTransaction();
TransactionalManager.commit(transactionObject.currentXid);
transactionObject.clear();
}
@Override
protected void doRollback(DefaultTransactionStatus status) throws TransactionException {
TransactionObject transactionObject = (TransactionObject) status.getTransaction();
TransactionalManager.rollback(transactionObject.currentXid);
transactionObject.clear();
}
@Override
protected void doSetRollbackOnly(DefaultTransactionStatus status) throws TransactionException {
// 在多个事务嵌套时子事务的传递方式为 REQUIRED加入当前事务
// 那么当子事务抛出异常时会调当前方法而不是直接调用 doRollback
// 此时不需要做任何处理即可默认上父级事务进行正常 doRollback 即可
// 此时需要标识 prevXid 进行 Rollback
TransactionObject transactionObject = (TransactionObject) status.getTransaction();
transactionObject.setRollbackOnly();
}
static class TransactionObject {
static class TransactionObject extends JdbcTransactionObjectSupport {
private static final ThreadLocal<String> ROLLBACK_ONLY_XIDS = new ThreadLocal<>();
private final String prevXid;
private String currentXid;
@ -88,6 +95,18 @@ public class FlexTransactionManager extends AbstractPlatformTransactionManager {
this.prevXid = prevXid;
}
public void setRollbackOnly(){
ROLLBACK_ONLY_XIDS.set(prevXid);
}
public void clear(){
ROLLBACK_ONLY_XIDS.remove();
}
@Override
public boolean isRollbackOnly() {
return currentXid.equals(ROLLBACK_ONLY_XIDS.get());
}
}
}

View File

@ -117,8 +117,14 @@ public class AccountController {
account.setUserName("haha1111");
accountMapper.update(account);
try {
//嵌套事务
accountService.update2();
}catch (Exception e){
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
System.out.println(">>>>>>e"+e);
}
return accountMapper.selectOneById(id);
}