关于数据库事务的简单总结

数据库事务有四个特性即ACID,具体分别是原子性,一致性,隔离性和持久性。事务如果在service层,那么每个业务处理方法有自己的事务,一个事务中只连接了数据库一次,有时候比如方法里面有多个增删改查这种情况,其实这也只连接了一次数据库,并不是多次访问数据库,这个容易混淆。

再来看MySQL四种事务隔离级别,隔离级别由高到低分别为串行化,可重复度,读已提交和读未提交。事务隔离级别可以通过sql语句设置,设置数据库的隔离级别一定要在开启事务之前。MySQL的默认隔离级别是可重复度。

高度隔离会限制可并行执行的事务数,所以一些应用程序选择降低隔离级别以换取更大的吞吐量。

如果数据库事务没有隔离会产生三个问题,分别为脏读,不可重复度和幻读。可以画张图对应一下关系。

简单总结:

脏读就是A插入了一个数据,还没提交被B读去了。如果A这个时候回滚了,B就读到了脏数据。不管A有没有回滚或者提交,如果A更新了一下这条数据,B在一个事务内又读了一次发现两次读的不一样,这就是不可重复读。幻读就是假设表中某个字段所有值都为1,A在读的时候B插入了一个2,A就读错了,这个2就像幻想一样。

读未提交当然问题最多,可以读到其他事务未提交的数据当然问题多。读并行事务已提交的数据就好一点,可以解决脏读问题。可重复读隔离级别下使用了MVCC机制,select操作不更新版本号即读的历史数据,而insert,update和delete会更新版本号,即用最新的数据去增删改,所以读不会有问题。理论上可串行是最安全的,那为什么MySQL不默认这个隔离级别呢,因为可串行读下每个事务不管读写都会锁表,效率太低了。

事务运行的三种模式:

1.自定提交事务

2.显式事务

3.隐性事务

关于Spring的事务管理:

原文链接:https://blog.csdn.net/wonabi/article/details/78059628

spring中管理方式的方式可分为两种:编程式和声明式事务。由于编程式事务使用较少(不符合spring习惯),故接下来重点阐述
声明式事务,声明式事务又可以分为XML配置方式和注解配置方式。在配置之前首先应该明确,spring中管理事务对象的依赖关系
如图:

现在以配置JDBC的事务管理为例,分别演示用XML方式和注解方式配置声明式事务。如下:

1.XML方式
步骤1.导入AOP开发相关的包,因为XML方式配置就是基于AOP开发思想的
Spring-aop.jar; aspectJ.jar;spring-aspects.jar
步骤2.配置事务管理器,注意上图,JDBC事务管理器依赖于DataSource存在,故在配置中需要体现此种关系

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
<property name="dataSource" ref="dataSource"/>
</bean>

步骤3.配置事务的通知

 

<! -- 配置事务的增强 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes> 	
<! --方法中可以配置的几个属性	
isolation="DEFAULT" 隔离级别	
propagation="REQUIRED" 传播行为	
read-only="false" 只读	
timeout="-1" 过期时间	
rollback-for="" -Exception	
no-rollback-for="" +Exception	-->	
<!-- 配置需要事务管理的方法,以转账方法为例--> 		
        <tx:method name="transfer" propagation="REQUIRED"/>	
    </tx:attributes>
</tx:advice>


步骤4.配置将通知织入目标


<aop:config>
<!--表示把事务织入到AccountServiceIml类中,所有以tranfer开头的方法中-->
    <aop:pointcut 
expression="execution(*com.cai.transaction.AccountServiceImpl.transfer(..))" id="pointcut1"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>


注解方式
步骤1,导包和开启事务管理与XML方式一致,不再累述。
步骤2.开启注解管理事务

<! -- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

步骤3.在使用的类中添加一个注解@Transactional
小结:对比以上两种方式,可以得出一个结论,XML方式配置比较麻烦,但是比较统一,可以一次性解决问题。注解配置方式比较简单,且比较灵活,可以在比较少事务管理的时候使用注解方式。在对项目要求严谨时,使用XML方式。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值