一.事务四要素(ACID)
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
二.事务的隔离级别
1、DEFAULT:MySQL的默认隔离级别:REPEATABLE_READ(可重复读);
Oracle默认的隔离级别: READ_COMMITTED(读已提交)
2、READ_UNCOMMITTED:读未提交,未解决任何并发问题。
3、READ_COMMITTED: 读已提交。解决度脏数据,存在不可重复读与幻读。
4、REPEATABLE_READ: 可重复度。解决脏读、不可重复读,存在幻读。
5、SERIALIZABLE: 串行化。 不存在并发问题。
脏读 | 重复读 | 幻读 | |
read_uncommitted | v | v | v |
read_committed | v | v | |
repeatable_read | v | ||
serializable |
三.事务的传播行为
控制业务方法是不是有事务的,是什么样的事务的。共有 7 个传播行为。(标红常用需掌握)
(1)PROPAGATION_REQUIRED:指定的方法必须在事务内执行。若当前存在事务,就加入当前事务中;若当前没有事务,则创建一个新事务。这种创博行为时最常见的选择,也是spring默认的事务传播行为。
(2)PROPAGATION_REQUIRES_NEW:总是新建一个事务,若当前存在事务,就将当前事务挂起,知道新事物执行完毕。
(3)PROPAGATION_SUPPORTS:指定方法支持当前事务,但若当前没有事务,也可以以非事务的方式执行。
(4)PROPAGATION_MANDATORY
(5)PROPAGATION_NESTED
(6)PROPAGATION_NEVER
(7)PROPAGATION_NOT_SUPPORTED
三.spring中事务实现
接口:PlatformTransactionManager,定义了事务的重要方法 commit、rollback
1、mybatis访问数据库—spring创建好的是DataSourceTransactionManager
2、hibernate访问数据库—spring创建好的是HibernateTransactionManager
1.xml方式
(1)配置数据源
<bean id="MydataSource" class="com.powernode.spring6.bean.MyDataSource"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>
(2)声明事务管理器对象
<!-- mybatis的事务管理器,id自定义 --> <!--1、声明spring的事务管理器,id自定义--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--连接的数据库,指定数据源--> <property name="dataSource" ref="myDataSource"/> </bean>
(3)开启事务注解驱动,告诉spring,使用注解的方式管理事务。spring使用aop机制,创建@Transactional所在的类代理对象,给方法加入事务功能。
<!--2、开启事务注解驱动,告诉spring使用注解管理事务,创建带对象 transaction-manager:事务管理器id --> <tx:annotation-driven transaction-manager="transactionManager"/>
(4)使用@Transactional 业务层方法添加事务
@Transactional的属性
isolation:设置隔离级别,该属性类型为isolation枚举,默认值为 Isolation.DEFUALT。
readOnly: 设置方法对数据库的操作是否只读的,默认值为false。
timeout: 设置本操作与数据库连接超时时限,默认值为-1,即没有时限。
rollbackFor:指定需要回滚的异常类。
rollbackForClassName:指定需要回滚的异常类类名
noRollbackFor:指定不需要回滚的异常类
noRollbackForClassName:指定不需要回滚的异常类类名
2.全注解开发方式
配置类加上@EnableTransactionManagement
@Configuration
@ComponentScan("com.jjh")
@EnableTransactionManagement //开启事务注解
public class SpringConfig {
//配置数据源
@Bean
public DataSource getDataSource(){
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/spring6?useSSL=false&serverTimezone=Asia/Shanghai");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
//配置jdbcTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
JdbcTemplate jdbcTemplate=new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//配置事务对象管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager=new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
五.超时timeout
可以指定超时时间,这里指的是最后一条DML语句执行完之前,后面的业务流程不算