@Transactional事物解释
来源:互联网 发布:js定时器 内存满了 编辑:程序博客网 时间:2024/05/29 04:09
事物的配置
- <!-- 配置事务管理器 -->
- <bean id="txManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
- p:dataSource-ref="dataSource">
- </bean>
- <!-- 开启事务控制的注解支持 -->
- <tx:annotation-driven transaction-manager="transactionManager"/></span></span>
// 指定回滚@Transactional(rollbackFor=Exception.class) public void methodName() { throw new Exception("..."); } //指定不回滚@Transactional(noRollbackFor=Exception.class) public ItimDaoImpl getItemDaoImpl() { throw new RuntimeException("注释");
参数名称
功能描述
readOnly
该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)
rollbackFor
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName
该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:
指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")
指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})
noRollbackFor
该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:
指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName
该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:
指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")
指定多个异常类名称:
@Transactional(noRollbackForClassName={"RuntimeException","Exception"})
propagation
该属性用于设置事务的传播行为,具体取值可参考表6-7。
例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
isolation
该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
timeout
该属性用于设置事务的超时秒数,默认值为-1表示永不超时
各种属性的意义:
REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。
NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。
REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。
MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。
SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。
NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。
NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
3,注解的使用
1, @Transactional
public long insertTrade(TradeData trade) throws Exception {}//上述方法仍然不能工作的原因是,要在 Spring 中使用 @Transactional 注释,必须在 Spring 配置文件中添加以下代码行:
<tx:annotation-driven transaction-manager="transactionManager"/>
这段代码告诉 Spring 在应用事务拦截器时使用 @Transaction 注释。如果没有它,就会忽略 @Transactional 注释,导致代码不会使用任何事务。
在单独使用不带任何参数的 @Transactional 注释时,传播模式要设置为 REQUIRED,只读标志设置为 false,事务隔离级别设置为 READ_COMMITTED,而且事务不会针对受控异常(checked exception)回滚。
2, @Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
public long insertTrade(TradeData trade) throws Exception {}//由于传播模式被设置为 SUPPORTS,所以不会启动任何事物,因此该方法有效地利用了一个本地(数据库)事务。只读标志只在事务启动时应用。在本例中,因为没有启动任何事务,所以只读标志被忽略。
3, @Transactional(readOnly = true, propagation=Propagation.REQUIRED)
public long insertTrade(TradeData trade) throws Exception {}//启动一个事务来执行只读操作会增加处理线程的开销,并会导致数据库发生共享读取锁定(具体取决于使用的数据库类型和设置的隔离级别)。总的来说,在获取基于 JDBC 的 Java 持久性时,使用只读标志有点毫无意义,并会启动不必要的事务而增加额外的开销。readOnly = true多数用来查询时使用。
4, readOnly=true表明所注解的方法或类只是读取数据。会告诉底层数据源,这个是一个只读事务,对于JDBC而言,只读事务会有一定的速度优化。而这样写的话,事务控制的其他配置则采用默认值,事务的隔离级别(isolation) 为DEFAULT,也就是跟随底层数据源的隔离级别,事务的传播行为(propagation)则是REQUIRED,所以还是会有事务存在,多条查询的这种情况可以使用只读事务,由于只读事务不存在数据的修改,将事务设置成只读后,相当于将数据库设置成只读数据库,此时若要进行写的操作,会出现错误。
readOnly=false表明所注解的方法或类是增加,删除,修改数据的时候,假如某一行代码报错了,那么这个方法里所有的操作都会被回滚,当作没发生过一样。@Transactional默认。
- @Transactional事物解释
- spring事物-@Transactional
- Spring 事物管理 @Transactional
- 事物注解方式: @Transactional
- 事物注解方式: @Transactional
- 事物注解方式: @Transactional
- Spring事物@Transactional 事物使用详解
- spring@transactional事物回滚
- spring boot @Transactional事物处理
- Spring @Transactional事物配置无效原因
- @Transactional的propagation参数解释
- @Transactional(readOnly = true)无法控制事物只读
- Spring中配置事物注解的方式: @Transactional
- @Transactional
- @Transactional
- @Transactional
- Transactional
- @Transactional
- 案例研究:使用 ETW 和 Netmon 解决未知 USB 设备的问题
- 【redis】服务端 数据库实现
- 阿萨德
- 【ZJOI2008】树的统计(树链剖分)
- PHP性能监控
- @Transactional事物解释
- PAT_A 1043. Is It a Binary Search Tree (25)
- Scrum 计划、站会、评审、回顾会议介绍
- Micropython加速物联网开发9
- Python入门:初识Python
- Integer分析
- 石头剪刀布
- 常用计算的实现
- BZOJ 1031 字符加密Cipher 后缀数组(计数排序)