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拿到的就是脏数据。这种操作就叫脏读。 |
问题 | 解释 |
---|---|
虚读(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的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。 |
注意:级别越高性能越低
推荐阅读
-
iOS学习笔记-139.RunLoop07——Runloop处理流程
-
Python学习笔记之os模块使用总结
-
7.1(java学习笔记)InetAddress&InetScoketAddress
-
Python学习笔记(一)(基础入门之环境搭建)
-
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
-
python网络编程学习笔记(10):webpy框架
-
wxpython学习笔记(推荐查看)
-
Linux学习笔记(十四)磁盘管理(二):格式化、挂载以及Swap分区
-
JavaScript中的Number数字类型学习笔记
-
Python ORM框架SQLAlchemy学习笔记之关系映射实例