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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_42447959/article/details/84937675