spring事务配置总结

spring事务配置总结

第一种:使用注解(推荐)
<!-- 第一步 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <!--注入sessionFactory-->
  <property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 第二步 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

业务层
@Transactional(isolation=Isolation.READ_COMMITTED,propagation=Propagation.REQUIRED,rollbackFor=Exception.class,readOnly=false)
public class UserServer{

  public void insert(){}

  public void delete(){}

  public void update(){}

  @Transactional(propagation=Propagation.SUPPORTS)
  public User selectById(){}
}

第二种:纯xml配置
<!-- 第一步 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <!-- 注入dataSource -->
  <property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 第二步 配置事务增强 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
  <!-- 做事务操作 -->
  <tx:attributes>
    <!-- 设置进行事务操作的方法匹配规则 -->
    <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
    <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="false" rollback-for="Exception"/>
  </tx:attributes>
</tx:advice>

<!-- 第三步 配置切面 -->
<aop:config>
  <!-- 切入点 -->
  <aop:pointcut expression="execution(* xxx.xxx.*.*(..))" id="pc"/>
  <!-- 切面 -->
  <aop:advisor advice-ref="txadvice" pointcut-ref="pc"/>
</aop:config>

------------------------------------------------------------------

事务属性:

1>隔离级别isolation:
  READ_UNCOMMITTED:读未提交,事务之间可以读取到对方未提交的数据,会导致【脏读,不可重复读,幻影读】
  READ_COMMITTED:读提交,事务之间只可以读取到对方已提交的数据,可以防止【脏读】【建议使用】
  REPEATABLE_READ:可重复读,一个事务多次读取同一条数据,结果一致,可以防止【脏读,不可重复读】
  SERIALIZABLE:序列化读,多个事务串行发生,可以防止一切非法的读取。
  *注意:隔离级别逐渐提高,并发性越来越差,但安全性越来越好。
  *非法的读取状态:
    1. 脏读:事务读取到了其他事务未提交的数据(重点记忆)
    2. 不可重复读:一个事务中多次读取同一条数据,但结果不一致。
    3. 幻影读:一个事务中多次读取同一张表,表的行数不一致。
  *在oracle中只支持 读提交和序列化读 且默认为 【读提交】

2>传播性propagation:防止事务嵌套。ServiceA的方法中调用了 ServiceB中方法。
  supports: 如果当前已有事务环境,则融入,否则在非事务环境下执行。适合查询业务
  required: 如果当前已有事务环境,则融入,否则新启动一个事务,在事务中运行。适合增删改业务
3>读写性readOnly:
  true:只读事务,适合查询业务,在事务中只允许查询操作
  fasle:读写事务,适合增删改业务,事务中允许查询和改动(默认)
4>回滚性rollback-for:
  在业务中抛出RuntimeException异常时自动回滚。
  在业务中抛出Exception异常时依然提交(默认)。

----------------------------------------------------------------------------

事务的概念:

事务是数据库保证数据完整性的一种机制,是数据库操作的最小单元,包括一条或者多条sql语句。在同一个事务的多条sql语句执行的过程中,要么同时成功,事务成功(事务提交:commit);如果有一条sql语句执行失败,整个事务失败,事务回滚(rollback)。

事务的开始:

  同一个事务中的多条sql中的第一条sql执行开始

事务结束:

  commit

  rollback

事务的特点:ACID(面试概念)
Atomicity:原子性,同一个事务中的多条sql不可分割。

Consistency:一致性,事务在操作前后的状态一致。

Isolation:隔离性,事务之间相互独立,没有影响。

Durability:持久性,事务的操作是持久化数据库

原文地址:https://www.cnblogs.com/lzhl/p/6520486.html