Spring Transcation 事务

文章介绍了数据库事务的四个基本特性——原子性、一致性、隔离性和持久性,并详细阐述了不同的事务隔离级别。接着,讨论了Spring框架中的事务传播行为和如何通过XML及注解配置进行事务管理,包括PlatformTransactionManager接口、DataSourceTransactionManager和HibernateTransactionManager的使用。此外,还提到了事务超时设置及其意义。
摘要由CSDN通过智能技术生成

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

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值