2021SC@SDUSC
上周的会议指出了项目的新方向在于指定一个XML规范,来实现文本的格式化存取,保存文本的格式信息,而非单只有文本内容信息。
大致如下:
另外,这周主要是继续学习Spring框架中的事务管理部分
事务管理
事务写在JavaEE三层结构中的Service层中
在Spring进行事务管理操作
有两种方式:编程式事务管理和声明式事务管理(一般使用后者)
声明式事务管理
- 基于注解(使用)
- 基于xml配置文件
在Spring进行声明式事务管理,底层使用AOP
Spring事务管理API
- 提供一个接口,代表事务管理器,这个接口针对不同的框架提供了不同的实现类
声明式事务管理(注解)
1、在spring配置文件中配置事务管理器
<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2、开启事务注解
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
3、在service类上面或方法上面添加事务注解
(1)@Transactional,这个注解添加到类上面,也可以添加在方法上面
(2)如果把这个注解添加在类上面,这个类里面的所有方法都添加事务
(3)如果把这个注解添加在方法上面,则这个方法形成一个事务
事务参数
在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
-
propagation:事务传播行为
(1)多事务方法直接进行调用,这个过程中事务是如何进行管理的
事务方法:对数据库表数据产生变化的被@Transactional注解的方法
这个场景产生于一个事务方法中调用了另一个方法
@Transactional public void add() { update(); } // 那么这时候怎么保证原子性 public void update() { }
-
isolation:事务隔离级别
-
timeout:超时时间
事务需要在一定时间内进行提交,如果没有提交则进行回滚
默认值为-1,设置时间以秒单位进行计算
-
readOnly:是否只读
读:查询操作
readOnly默认为false
-
rollbackFor:回滚
设置出现哪些异常进行事务回滚
-
noRollbackFor:不回滚
设置出现哪些异常不进行事务回滚
完全注解方式
@Configuration
@ComponentScan(value = "com.company")
@EnableTransactionManagement
public class TransactionConfig {
// 创建一个数据库连接池
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql:///spring_demo");
druidDataSource.setUsername("root");
druidDataSource.setPassword("root");
return druidDataSource;
}
// 创建JabcTemplate
@Bean
public JdbcTemplate getTemplate(DruidDataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate();
// 注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
// 创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTxManager(DruidDataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}