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> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-annotation</artifactId>
<version>1.7.3</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -15,6 +15,7 @@
*/ */
package com.mybatisflex.core.mybatis; package com.mybatisflex.core.mybatis;
import com.mybatisflex.core.util.StringUtil;
import org.apache.ibatis.annotations.AutomapConstructor; import org.apache.ibatis.annotations.AutomapConstructor;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.binding.MapperMethod.ParamMap; 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 { List<Object> constructorArgs, Constructor<?> constructor, boolean foundValues) throws SQLException {
for (int i = 0; i < constructor.getParameterTypes().length; i++) { for (int i = 0; i < constructor.getParameterTypes().length; i++) {
Class<?> parameterType = constructor.getParameterTypes()[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); TypeHandler<?> typeHandler = rsw.getTypeHandler(parameterType, columnName);
Object value = typeHandler.getResult(rsw.getResultSet(), columnName); Object value = typeHandler.getResult(rsw.getResultSet(), columnName);
constructorArgTypes.add(parameterType); constructorArgTypes.add(parameterType);

View File

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

View File

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

View File

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

View File

@ -18,6 +18,7 @@ package com.mybatisflex.spring;
import com.mybatisflex.core.transaction.TransactionContext; import com.mybatisflex.core.transaction.TransactionContext;
import com.mybatisflex.core.transaction.TransactionalManager; import com.mybatisflex.core.transaction.TransactionalManager;
import com.mybatisflex.core.util.StringUtil; import com.mybatisflex.core.util.StringUtil;
import org.springframework.jdbc.datasource.JdbcTransactionObjectSupport;
import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionException;
import org.springframework.transaction.support.AbstractPlatformTransactionManager; import org.springframework.transaction.support.AbstractPlatformTransactionManager;
@ -63,23 +64,29 @@ public class FlexTransactionManager extends AbstractPlatformTransactionManager {
protected void doCommit(DefaultTransactionStatus status) throws TransactionException { protected void doCommit(DefaultTransactionStatus status) throws TransactionException {
TransactionObject transactionObject = (TransactionObject) status.getTransaction(); TransactionObject transactionObject = (TransactionObject) status.getTransaction();
TransactionalManager.commit(transactionObject.currentXid); TransactionalManager.commit(transactionObject.currentXid);
transactionObject.clear();
} }
@Override @Override
protected void doRollback(DefaultTransactionStatus status) throws TransactionException { protected void doRollback(DefaultTransactionStatus status) throws TransactionException {
TransactionObject transactionObject = (TransactionObject) status.getTransaction(); TransactionObject transactionObject = (TransactionObject) status.getTransaction();
TransactionalManager.rollback(transactionObject.currentXid); TransactionalManager.rollback(transactionObject.currentXid);
transactionObject.clear();
} }
@Override @Override
protected void doSetRollbackOnly(DefaultTransactionStatus status) throws TransactionException { protected void doSetRollbackOnly(DefaultTransactionStatus status) throws TransactionException {
// 在多个事务嵌套时子事务的传递方式为 REQUIRED加入当前事务 // 在多个事务嵌套时子事务的传递方式为 REQUIRED加入当前事务
// 那么当子事务抛出异常时会调当前方法而不是直接调用 doRollback // 那么当子事务抛出异常时会调当前方法而不是直接调用 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 final String prevXid;
private String currentXid; private String currentXid;
@ -88,6 +95,18 @@ public class FlexTransactionManager extends AbstractPlatformTransactionManager {
this.prevXid = prevXid; 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"); account.setUserName("haha1111");
accountMapper.update(account); accountMapper.update(account);
//嵌套事务 try {
accountService.update2(); //嵌套事务
accountService.update2();
}catch (Exception e){
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
System.out.println(">>>>>>e"+e);
}
return accountMapper.selectOneById(id); return accountMapper.selectOneById(id);
} }