Spring Transcation 事务

一.事务四要素(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)配置数据源

   
        
        
        
        
    

 

  (2)声明事务管理器对象





	

(3)开启事务注解驱动,告诉spring,使用注解的方式管理事务。spring使用aop机制,创建@Transactional所在的类代理对象,给方法加入事务功能。



(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语句执行完之前,后面的业务流程不算

 

你可能感兴趣的:(spring,java,数据库)