规格说明就是加载某些模块的注意事项,需要根据不同说明去加载进来。
导入机制在导入期间会使用有关每个模块的多种信息,特别是加载之前。 大多数信息都是所有模块通用的。 模块规格说明的目的是基于每个模块来封装这些导入相关信息。
在导入期间使用规格说明可允许状态在导入系统各组件之间传递,例如在创建模块规格说明的查找器和执行模块的加载器之间。 最重要的一点是,它允许导入机制执行加载的样板 *** 作,在没有模块规格说明的情况下这是加载器的责任。
模块的规格说明会作为模块对象的 __spec__ 属性对外公开。 有关模块规格的详细内容请参阅 ModuleSpec。
34 新版功能
544 导入相关的模块属性
导入机制会在加载期间会根据模块的规格说明填充每个模块对象的这些属性,并在加载器执行模块之前完成。
__name__
__name__ 属性必须被设为模块的完整限定名称。 此名称被用来在导入系统中唯一地标识模块。
__loader__
__loader__ 属性必须被设为导入系统在加载模块时使用的加载器对象。 这主要是用于内省,但也可用于额外的加载器专用功能,例如获取关联到加载器的数据。
__package__
模块的 __package__ 属性必须设定。 其取值必须为一个字符串,但可以与 __name__ 取相同的值。 当模块是包时,其 __package__ 值应该设为其 __name__ 值。 当模块不是包时,对于最高层级模块 __package__ 应该设为空字符串,对于子模块则应该设为其父包名。 更多详情可参阅 PEP 366。
该属性取代 __name__ 被用来为主模块计算显式相对导入,相关定义见 PEP 366。 预期它与 __spec__parent 具有相同的值。
在方法中,使用了hana数据源从hana数据库中查出数据,然后将数据写到mysql数据库中,对数据库进行修改 *** 作时,我们一般会添加事务回滚的 *** 作,以便程序出错时可以还原数据库。
问题:
在方法中添加能使程序异常的代码(比如:int i = 1/0;)进行测试,并在方法中贴上以下注解:
@Transactional(rollbackFor = Exceptionclass)
复制
但是发现事务并没有回滚
检查了项目的配置, 两个数据源配置了事务管理器:
hana数据源配置:
import javaxsqlDataSource;
import combaomidoumybatisplusspringMybatisSqlSessionFactoryBean;
import orgapacheibatissessionSqlSessionFactory;
import orgmybatisspringSqlSessionTemplate;
import orgmybatisspringannotationMapperScan;
import orgspringframeworkbeansfactoryannotationQualifier;
import orgspringframeworkbootjdbcDataSourceBuilder;
import orgspringframeworkcontextannotationBean;
import orgspringframeworkcontextannotationConfiguration;
import orgspringframeworkcontextannotationPrimary;
import orgspringframeworkcoreiosupportPathMatchingResourcePatternResolver;
import orgspringframeworkjdbcdatasourceDataSourceTransactionManager;
import topibase4jcoreConstants;
import topibase4jcoreutilPropertiesUtil;
import topibase4jcoreutilSecurityUtil;
@Configuration
@MapperScan(basePackages = "comxxxmapperhana",sqlSessionTemplateRef ="hanaSqlSessionTemplate")
public class HanaDataSourceConfig {
/创建数据源/
@Bean(name = "hanaDataSource")
@Primary
public DataSource gethanaDataSource() {
DataSource build = DataSourceBuildercreate()
driverClassName(PropertiesUtilgetString("hanadriverClassName"))
url(PropertiesUtilgetString("hanaurl"))
username(PropertiesUtilgetString("hanausername"))
password(SecurityUtildecryptDes(PropertiesUtilgetString("hanapassword"), ConstantsDB_KEYgetBytes()))
build();
return build;
}
@Bean(name = "hanaSqlSessionFactory")
@Primary
public SqlSessionFactory hanaSqlSessionFactory(@Qualifier("hanaDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
beansetDataSource(dataSource);
//设置mapper配置文件
beansetMapperLocations(new PathMatchingResourcePatternResolver()getResources("classpath:mapper/hana/xml"));
return beangetObject();
}
/创建事务管理器/
@Bean("hanaTransactionManger")
@Primary
public DataSourceTransactionManager hanaTransactionManger(@Qualifier("hanaDataSource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
/创建SqlSessionTemplate/
@Bean(name = "hanaSqlSessionTemplate")
@Primary
public SqlSessionTemplate hanaSqlSessionTemplate(@Qualifier("hanaSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
复制

mysql数据源配置:
import combaomidoumybatisplusspringMybatisSqlSessionFactoryBean;
import orgapacheibatispluginInterceptor;
import orgapacheibatissessionSqlSessionFactory;
import orgmybatisspringSqlSessionTemplate;
import orgmybatisspringannotationMapperScan;
import orgspringframeworkbeansfactoryannotationQualifier;
import orgspringframeworkbootjdbcDataSourceBuilder;
import orgspringframeworkcontextannotationBean;
import orgspringframeworkcontextannotationConfiguration;
import orgspringframeworkcontextannotationEnableAspectJAutoProxy;
import orgspringframeworkcoreiosupportPathMatchingResourcePatternResolver;
import orgspringframeworkjdbcdatasourceDataSourceTransactionManager;
import orgspringframeworktransactionannotationEnableTransactionManagement;
import topibase4jcoreutilPropertiesUtil;
import javaxannotationResource;
import javaxsqlDataSource;
@Configuration
@MapperScan(basePackages = "comxxxmappermysql",sqlSessionTemplateRef ="mysqlSqlSessionTemplate")
public class MysqlDataSourceConfig {
@Resource
private MybatisPlusConfig mybatisPlusConfig;
/创建数据源/
@Bean(name = "mysqlDataSource")
public DataSource getmysqlDataSource() {
DataSource build = DataSourceBuildercreate()
driverClassName(PropertiesUtilgetString("druiddefaultdriverClassName"))
url(PropertiesUtilgetString("druidwriterdefaulturl"))
username(PropertiesUtilgetString("druidwriterdefaultusername"))
password(PropertiesUtilgetString("druidwriterdefaultpassword"))
build();
return build;
}
@Bean(name = "mysqlSqlSessionFactory")
public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
beansetDataSource(dataSource);
//设置mapper配置文件
beansetMapperLocations(new PathMatchingResourcePatternResolver()getResources("classpath:mapper/mysql/xml"));
Interceptor[] interceptors = {
mybatisPlusConfigpaginationInterceptor(),
mybatisPlusConfigperformanceSonInterceptor()
};
beansetPlugins(interceptors);
return beangetObject();
}
/创建事务管理器/
@Bean("mysqlTransactionManger")
public DataSourceTransactionManager mysqlTransactionManger(@Qualifier("mysqlDataSource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
/创建SqlSessionTemplate/
@Bean(name = "mysqlSqlSessionTemplate")
public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
复制

由于默认的数据源是hana数据源,但是现在我们要将mysql的事务进行回滚,如果不将默认的事务管理器设置mysql对应的事务管理器为默认的话, 事务回滚将不起作用。
因此,可以添加配置类,以配置默认的事务管理器为mysql的,配置类要实现TransactionManagementConfigurer
/
将mysql数据源的事务管理器设置为默认的事务
/
@Configuration
public class SpecifyDefaultTransactionManagerConfig implements TransactionManagementConfigurer {
@Autowired
private MysqlDataSourceConfig mysqlDataSourceConfig;
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return mysqlDataSourceConfigmysqlTransactionManger(mysqlDataSourceConfiggetmysqlDataSource());
}
复制

再次进行测试,事务将回滚成功
如果不想添加配置类,可以在注解中标明使用的是哪个事务管理器
这里我们要用的是mysql的,因此可以这样配置
@Transactional(value = "mysqlTransactionManger",rollbackFor = Exceptionclass)
复制
value的值就是事务管理器bean的名称
spring boot
三星电视
精选推荐
广告

springboot多数据源即分布式事务解决方案
79下载·0评论
2018年10月16日
SSM多数据源配置事务回滚处理
2777阅读·0评论·1点赞
2019年1月15日
MySQL 多库事务回滚
284阅读·0评论·0点赞
2022年10月23日
Spring Boot多数据源(支持Spring声明式事务切换和回滚)pdf
10下载·0评论
2021年7月21日
Spring 事务
165阅读·0评论·0点赞
2020年4月14日
java多数据源回滚_Spring多数据源事务
1053阅读·0评论·0点赞
2021年3月10日
Springboot多数据源 解决事务回滚失效
3004阅读·6评论·2点赞
2021年8月6日
springboot 多数据源 添加事务,事务回滚
1125阅读·4评论·0点赞
2021年12月1日
dynamic-datasource多数据源的配置使用(读写分离、事务的回滚)
4146阅读·3评论·4点赞
2022年1月26日
Spring Boot项目多数据源事务不生效的问题
2641阅读·0评论·8点赞
2021年10月15日
Springboot集成SpringJDBC多数据源事务回滚(二)
如果你是菜鸟一级的,那就不正常了!以前鄙人用486仿真开关电源(UPS),是下班按下回车键,第二天早上拿结果,那是因为鄙人是模拟电路“牛人”(好汉不提当年勇)。就算是模块多,电路复杂,也不要这样折腾。电路再复杂,还是想办法划分清楚,信号统一,层次清晰,逐个仿真。出了问题,也好定位,快速解决。我用CPLD/FPGA若干年了,很少仿真!问题出在哪里,了然于心!劝你多多仿真简单的功能电路,减少仿真复杂电路。
以上就是关于程序开发中模块加载规格的说明是什么全部的内容,包括:程序开发中模块加载规格的说明是什么、失败回滚项目变成子模块、我的程序由很多子模块构成,MAX-PLUS2编译仿真时间几个小时了,还没完成编译,这正常吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)