Spring声明式事务
Spring声明式事务
事务ACID原则
-
原子性 ==》事务是一个不可再分割的工作单位,事务中的操作要么都执行,要么都不执行
-
一致性 ==》一致性是指在执行一个事务前和后,数据库的完整性约束没有没有被破坏
-
隔离性 ==》隔离性是指多个事务并发时,每个事务应该是隔离的,一个事务不应影响其他事务的运行效果
事务并发问题 要了解事务的隔离级别,就要先了解事务并发会面临的问题 1. 脏读:事务A读取了事务B的更新的数据,但是事务B回滚了,导致A读取的为脏数据。 2. 不可重复读:事务A读取同一数据两次,但是在两次之间事务B对该数据进行了修改并提交,导致事务A读取两次读取不一致 3. 幻读:所谓幻读,就是同一个事务,连续做两次当前读 (例如:select * from t1 where id = 10 for update;),那么这两次当前读返回的是不相同的记录 注意:不可重复读和幻读很容易混淆,不可重复读针对的时数据的修改,幻读针对的时数据的新增和删除。解决不可重复读问题只需要给对应记录上行锁,而解决幻读需要对表加锁。 -
持久性 ==》事务一旦提交,系统发生任何问题,结果都不会改变,被持久化的写到存储中(例如数据库)
AOP配置声明式事务
<!-- 1. 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 2. 配置事务属性 -->
<!--<tx:advice>元素声明事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 根据方法名指定事务的属性 -->
<tx:method name="*"/>
<!--propagation配置事务传播行为-->
<tx:method name="purchase" propagation="REQUIRES_NEW"/>
<!--isolation配置事务的隔离级别-->
<tx:method name="update*" isolation="SERIALIZABLE"/>
<!--rollback-for配置事务遇到异常必须回滚,no-rollback-for配置事务遇到异常必须不能回滚-->
<tx:method name="add*" rollback-for="java.io.IOException" no-rollback-for="com.dmsd.spring.tx.BookStockException"/>
<!--read-only配置事务只读属性-->
<tx:method name="find*" read-only="true"/>
<!--timeout配置事务的超时属性-->
<tx:method name="get*" timeout="3"/>
</tx:attributes>
</tx:advice>
<!-- 3. 配置事务切入点, 以及把事务切入点和事务属性关联起来 -->
<aop:config>
<aop:pointcut expression="execution(* com.atguigu.spring.tx.xml.service.*.*(..))"
id="txPointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>

浙公网安备 33010602011771号