欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring 事务学习笔记

程序员文章站 2022-07-04 23:42:38
...

使用事务

注解配置

//事务注解用法
@Transactional(readOnly = false, propagation = Propagation.REQUIRED,rollbackFor=Exception.class,timeout=10)
public void save(Goods goods) throws Exception {...}

XML配置

<!-- 配置事务的传播特性 -->  
<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes> 
		<!-- 写操作: 增、删、改 --> 
		<tx:method name="add*" propagation="REQUIRED" />
		<tx:method name="del*" propagation="REQUIRED" />
		<tx:method name="upd*" propagation="REQUIRED" />
		<!-- 只读事务:查 --> 
		<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
	</tx:attributes>
</tx:advice>
<!-- 配置需要事务的方法 -->  
<aop:config>  
	<aop:pointcut id="txPointcut" expression="execution(* com.jerry.service..*.*(..))" />  
	<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>  
</aop:config>

传播行为 Transaction Propagation

事务类型 描述
PROPAGATION_REQUIRED 0 你有事务我就用你的,你没有我就自己创建一个,反正老子就是要事务。
PROPAGATION_SUPPORTS 1 你有事务我就用你的,你没有就算了,我不稀罕。
PROPAGATION_MANDATORY 2 你没事务还敢调用老子,异常走你~~~~
PROPAGATION_REQUIRES_NEW 3 老子不管你那套,你有事务是你的事,一边待着。老子自己得创建自己的事务。
PROPAGATION_NOT_SUPPORTED 4 老子不要事务,你调用我就了不起啊。我就按非事务方式跑
PROPAGATION_NEVER 5 老子说了不要事务你还来,异常走你~~~~~~~~~~~
PROPAGATION_NESTED 6 先说好,你有没有事务,咱们都井水不犯河水。我的事务我说了算,我提交、回滚与你无关。

事务隔离特性

问题 解释
脏读(Dirty read) 事务A读取了B修改的数据后,B又撤销了。这时A拿到的就是脏数据。这种操作就叫脏读。

不可重复读(Nonrepeatable read)

问题 解释
虚读(phantomread) 在一个事务内相同的查询执2+次,但每次结果不一样,这叫不可重复读。通常是因为另一个并发事务在两次查询之间更新了数据。关注点:是读的结果出翔,锁行可解决
幻读(Phantom reads) 事务A读取几行记录后,另一个并发事务B插入了一些记录时,幻影读就发生了。在后来的查询中,第一个事务A就会发现一些原来没有的额外记录。关注点:是增/删的结果出翔,需要锁表解决
隔离性 脏读 不可重读 幻读 说明
ISOLATION_DEFAULT -1 使用后端数据库默认的隔离级别。
ISOLATION_READ_UNCOMMITTED 1 允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读。
ISOLATION_READ_COMMITTED 2 × 允许从已经提交的并发事务读取。可防止脏读,但幻影读和不可重复读仍可能会发生。
ISOLATION_REPEATABLE_READ 3 × × 对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变。可防止脏读和不可重复读,但幻影读仍可能发生。
ISOLATION_SERIALIZABLE 4 × × × 完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。

注意:级别越高性能越低

相关标签: Spring 事务