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:持久性,事务的操作是持久化数据库