mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-08 01:28:24 +08:00
Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
d84427dd37
@ -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>
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user