什么是事务?Mysql事务怎么用?Mybatis怎么操作事务的?Spring呢?快进来看看

目录

一、计算机中的事务

1. 概念

2.事务的ACID特性

3.事务类型

1)手动事务

2)自动事务

4.为什么需要事务?

5.优点

二、MySQL事务

1.语法格式:

2.关闭自动提交,开启新事务

3.开启自动提交,关闭事务控制

三、Mybatis事务

Mybatis开关事务控制的方式

四、spring声明式事务

1.使用XML配置事务

2.使用注解声明式事务

3.使用java类配置事务

五、总结


一、计算机中的事务

1. 概念

 指将一系列数据操作捆绑成为一个整体并进行统一管理的机制。

注: 这里的事务一般指sql中的事务

2.事务的ACID特性

1).原子性(Atomicity ) :事务是一个完整的操作,事务的各步操作都是一个不可再分的最小单元。

2).一致性(Consistency ) : 事务中的所有元素必须作为一个整体提交或回滚,当事务完成时,数据必须处于一致状态。

3).隔离性(lsolation ): 所有并发事务之间是彼此隔离、独立,不应以任何方式依赖于或影响其他事务。

4).持久性(Durability) : 事务完成后,它对数据库的修改被永久保持。

3.事务类型

1)手动事务

  • 需要手动提交事务,进行事务控制。

2)自动事务

  • 自动提交事务,不能对事务进行控制。

4.为什么需要事务?

   当实现转账时,A向B转账过程中,系统发生错误,这笔帐没有在他们之间的手中,为避免发生此类错误,所以就需要事务处理,如果事务执行时遇到错误,则就必须回滚,回滚后,数据将全部恢复到操作前的状态,A的转账也会恢复。

5.优点

 如果其中一个sql发生异常,就不会提交,会进行一个回滚操作,避免了异常的发生等。

二、MySQL事务

 MySQL中的事务默认是隐式(自动)事务,如果需要开启手动事务控制,需使用语法开启。

1.语法格式:

#开启事务
begin; 或 start transaction;
  #一组作为事务运行的SQL语句
   delete from student where id=1;
  #根据需求回滚,还没提交前
  rollback;
#提交事务
commit; 

2.关闭自动提交,开启新事务

set autocommit=0;
  #一组作为事务运行的SQL语句
#提交事务
commit;   

3.开启自动提交,关闭事务控制

set autocommit=1;
  #一组作为事务运行的SQL语句
     或
 #放在事务最后一句,关闭事务,恢复Sql  

三、Mybatis事务

Mybatis在配置文件中可以设置事务的类型:如下图有关Mybatis事务类型的介绍:

图片来源:Mybtais中文网: 配置_MyBatis中文网

Mybtais配置时一般都使用JDBC类型来进行事务管理。

<transactionManager type="JDBC"/>

注明: 如上图提示所说,如果要使用spring+Mybtais,就没有必要配置了,Spring有自带的管理器。

Mybatis开关事务控制的方式

 如下图所示:Mybatis给我们提供了两个控制事务得重载方法,第一个openSession()方法可以在查询得情况下使用,openSession(boolean var1)条件是来判断事务是否是自动提交

1.false 默认值: 关闭自动提交事务,需要手动提交(开启事务控制)

2.true 开启:  开启自动提交事务(关闭事务控制)

 注明: 一般执行增删改方法时需要设置事务的开关,关闭自动提交,就需要手动提交,反正,不需要。

比如:

 
    public int addSysUser(SysUser sysUser) throws IOException {
        //关闭自动提交,开启事务控制
        SqlSession sqlSession = MybatisUtil.getSqlSession(false);
        int i = sqlSession.getMapper(UserMapper.class).addSysUser(sysUser);
        //手动提交
        sqlSession.commit();
        return userMapper.addSysUser(sysUser);
    }

四、spring声明式事务

没声明前: 需要手动处理事务,比如回滚提交,遇到多个方法达不到重用性。

声明后 : 开启事务控制,体现事务的ACID特性,通过底层AOP动态代理自动处理事务的提交和回滚,无需手动处理

配置前提: 在配置事务之前,需要先配置事务管理器 : 提供对事务处理的全面支持和统一管理

1.使用XML配置事务

 配置事务管理器

  <!--配置事务管理器-->
    <bean id="transactionManager" 
       class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--定义数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

- 设置事务属性(非必要)

SUPPORTS :  表示如果存在一个事务,则支持当前事务,如果当前没有事务,则按非事务执行,适用于查询。

REQUIRED : 默认值。表示如果存在一个事务,则支持当前事务;如果当前没有事务,则开启一个新的事务,适用于增删改。

以上事务规则属性只是常用的,还有其他事务属性,这里小半就不一一概述了哦!

<tx:advice  id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--propagation: 指定事务级别规则-->
            <tx:method name="get*" propagation="SUPPORTS"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
</tx:advice>

- 定义事务切面

<!--定义事务切面: 指定切入点选择要开启事务的方法-->
 <aop:config>
        <aop:pointcut id="serviceMethod" expression="execution(* service.StudentServiceImpl.*(..))"/>
         <!--引用事务规则级别-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
 </aop:config>

2.使用注解声明式事务

- 给需要开启事务的方法增加注解

@Transactional
pubic void method(){...}

- 在xml配置文件中扫描事务

<!--开启事务注解驱动-->
<tx:annotation-driven/>

注明 : 也可以直接以类的方式声明@Transactional,表示该类里所有的方法都声明了事务。

3.使用java类配置事务

- 在java配置类里增加@EnableTransactionManagement注解

//该注解扫描事务
@EnableTransactionManagement
@Configuration
public class ApplicationConfing{....}

在需要开启事务的方法上面增加@Transactional注解

五、总结

 其实不管用什么框架或者不同的数据库,事务都要遵循ACID特性,和提交回滚的方法,不过需要注意的是每个框架开启事务的方式都是不同的。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值