
- 一、事务简介
- 二、四大特性 (ACID)
- 三、核心配置文件
- 四、为什么要使用Mybatis整合Spring
- 五、隔离级别和事务的传播行为
- TransactionDefinition 接口中定义的隔离级别
- TransactionDefinition 接口中定义的7种事务传播行为
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务由一组 SQL 语句组成。事务应该具有 4 个属性:原子性、一致性、隔离性、持久性。这四个属性通常成为 ACID 特性
二、四大特性 (ACID)1. 原子性(Atomicity):事务是一个不可分割的工作单位,事务中包含许多 *** 作,要么都做,要么都不做
2. 一致性(Consistency):事务必须使数据库从一个一致性转发太变到另一个一致性状态,事务的中间状态不能被观察到
3. 隔离性(Isolation):一个事务的执行不能被其它事务干扰。即一个事务内部的 *** 作及使用的数据对并发的其它事务是隔离的,并发执行的各个事物之间不能互相干扰。隔离性又分为四个级别:读未提交(read uncommitted)、读已提交(read committed,解决脏读)、可重复读(repeatable read,解决虚读)、 串行执行(serializable,解决幻读)
-
读未提交:允许另外一个事务读取到当前未提交的数据,隔离级别最低,可能导致脏读、幻读或不可重复读
-
读已提交:被一个事务修改的数据提交后才能被另外一个事务读取,可以避免脏读,无法避免幻读、而且不可重复读
-
可重复读:允许重复读,可避免脏读,资源消耗上升。这是MySQL数据库的默认隔离级别
-
串行执行:也就是按照时间顺序执行多个事务,不存在并发问题,最可靠,但性能与效率最低
4. 持久性(Durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他 *** 作或故障不应该对其有任何影响
为什么需要事务?
- 如果不配置事务,可能存在数据提交不一致的情况
- 如果不在Spring中去配置声明式事务,我们就需要在代码中手动配置事务
- 事务在项目的开发中十分重要,设计到数据的一致性和完整性问题
spring核心文件配置(通过横切技术实现)
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
bean>
<tx:advice id="txADVICE" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="query" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
tx:attributes>
tx:advice>
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.vinjcent.service.*.*(..))"/>
<aop:advisor advice-ref="txADVICE" pointcut-ref="txPointCut"/>
aop:config>
四、为什么要使用Mybatis整合Spring
使用 Mybatis-Spring 的其中一个主要原因是它允许 Mybatis 参与到 Spring 的事务管理中。而不是给 MyBatis 创建一个新的专用事务管理器,MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理
一旦配置好了 Spring 的事务管理器,你就可以在 Spring 中按你平时的方式来配置事务。并且支持@Transactional注解和 AOP 风格的配置。在事务处理期间,一个单独的 SqlSession 对象将会被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚
事务配置好了以后,Mybatis-Spring 将会透明地管理事务。这样在你的 Dao 类中就不需要额外的代码了
五、隔离级别和事务的传播行为TransactionDefinition 接口中定义的隔离级别
| 隔离级别 | 说明 |
|---|---|
| ISOLATION_DEFAULT | 采用当前数据库默认的事务隔离级别 |
| ISOLATION_READ_UNCOMMITTED | 读未提交。允许另外一个事务读取到当前未提交的数据,隔离级别最低,可能导致脏读、幻读或不可重复读 |
| ISOLATION_READ_COMMITTED | 读已提交。被一个事务修改的数据提交后才能被另外一个事务读取,可以避免脏读,无法避免幻读、而且不可重复读 |
| ISOLATION_REPEATABLE_READ | 允许重复读,可避免脏读,资源消耗上升。这是MySQL数据库的默认隔离级别 |
| REPEATABLE_SERIALIZABLE | 事务串行执行,也就是按照时间顺序执行多个事务,不存在并发问题,最可靠,但性能最低 |
| 事务传播行为 | 说明 |
|---|---|
| PROPAGATION_REQUIRED | 默认的事务传播行为。如果当前存在一个事务,则加入该事务;如果当前没有事务,则创建一个新的事务 |
| PROPAGATION_SUPPORTS | 如果当前存在一个事务,则加入该事务;如果当前没有事务,则以非事务方式执行 |
| PROPAGATION_MANDATORY | 当前必须存在一个事务,如果没有,就抛出异常 |
| PROPAGATION_REQUIRES_NEW | 创建一个新的事务,如果当前已存在一个事务,将已存在的事务挂起 |
| PROPAGATION_NOT_SUPPORTED | 不支持事务,在没有事务的情况下执行,如果当前已存在一个事务,则将已存在的事务挂起 |
| PROPAGATION_NEVER | 永远不支持当前的事务,如果当前已存在一个事务,则抛出异常 |
| PROPAGATION_NESTED | 如果当前存在事务,则在当前事务的一个子事务中执行 |
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)