事务
什么是事务?
事务是数据库操作最基本单元,逻辑上一组操作。要么都成功,如果有一个失败所有操作都失败。
事务四个特性(ACID)
-
Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
-
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
-
Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
-
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
搭建事务操作环境
银行转账
创建表
创建service,搭建dao,完成对象创建和注入
service注入dao,dao注入JdbcTemplate,JdbcTemplate注入dataSource
在dao中创建多钱,少钱两个方法,在service中创建转账的方法。
若在转账过程中出现了问题(如服务器故障等),少钱的操作已完成,多钱的却没有执行。
此时再次执行就出现了问题,如何解决呢?(事务)
编程式:
开启事务;进行业务操作;没有发生异常,提交事务;发生异常,事务回滚。
事务操作(Spring)
事务添加到JavaEE三层结构里面Service层(业务逻辑层)
在Spring进行事务管理操作
两种方式:编程式事务管理↑ 和 声明式事务管理 (常使用)
声明式事务管理
基于注解方式(常使用)
基于xml配置文件方式
在Spring进行声明式事务管理,底层使用AOP
Spring提供一个接口,代表事务管理器
注解方式
在spring配置文件中配置事务管理器
在spring配置文件中开启事务注解
引入tx名称空间......
在service类上面或(service类里面方法上面)添加事务注解
如果把这个注解添加类上面,这个类里面所有的方法都添加事务
如果把这个注解添加到方法上面,只是这个方法添加了事务
此时再执行有错误的转账方法,就不会出现错误了。
声明式事务管理参数配置
在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
propagation:事务传播行为
多事务方法之间进行调用,这个过程中事务是如何进行管理的
另外5种
默认的情况就是REQUIRED
isolation:事务隔离级别
三个问题:脏读,不可重复读,幻读
timeout:超时时间
事务需要在一定时间内进行提交,如果不提交则回滚。默认-1,不超时
readOnly:是否只读
读:查询操作,写:添加修改删除操作
rollbackFor:回滚
设置出现了哪些异常进行回滚
noRollbackFor:不回滚
设置出现了哪些异常不进行回滚
完全注解方式
创建配置类,替代xml配置文件
@Configuration //配置类
@ComponentScan(basePackages = "com.gyq.spring5") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///studio");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
//创建Jdbc模板对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入DataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
测试
XML方式
在spring配置文件中进行配置
配置事务管理器,配置通知,配置切入点和切面
Spring5新功能
整个框架的代码基于java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除。
Spring5.0框架自带了通用的日志封装
Spring5已经移除Log4jConfigListener,官方建议使用Log4j2。
Spring5框架整合Log4j2
引入jar包
创建Log4j2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--日志级别以及优先级顺序:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE >ALL-->
<!--Configuration后面的status用于设置log4j2自身内部的信息输出,可以不设置,当设置为trace时,可以看到log4j2内部各种详细输出-->
<configuration status="INFO">
<!--先定义所有的appender-->
<appenders>
<!--输出日志信息到控制台-->
<console name="Console" target="SYSTEM_OUT">
<!--控制日志输出的格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</console>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<!--root:用于指定项目的根目录,如果没有单独指定的Logger,则会使用root作为默认的日志输出-->
<loggers>
<root level="info">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
执行一个测试方法
控制台输出
另一种方式
手动进行日志输出
Nullable注解和函数式注册对象
@Nullable注解可以使用在方法,属性,参数上面,表示方法返回,属性值,参数值可以为空。
Spring5核心容器支持函数表达式风格GenericApplicationContext
Spring5支持整合JUnit5单元测试框架
整合JUnit4
引入Spring相关针对测试依赖
创建测试类,使用注解方式完成
整合JUnit5
引入依赖
创建测试类,使用注解方式完成
简化的写法
WebFlux待学......