你知道@Transactional注解的失效场景吗?
在使用Spring的时候,进行事务管理变得相当简单:只要在方法上加上 @Transactional 就可以了,Spring就帮我们做了事务的开启、提交和回滚等操作,甚至我一度认为 @Transactional 就是等于Spring事务,只要是见到有数据库操作的方法,默认的统统加上此注解,自以为是的就万事大吉了。你是不是也有与我相同的经历呢:) 其实, @Transactional 也不是在任何的场景下都有效的,有时候会莫名的失效,在介绍之前呢,我们先来认识一下。 1、 @Transactional 注解可以用在哪些地方呢? 作用于类: 表示所有public方法都配置相同的事务信息。 作用于方法: 代表方法的事务信息,其会覆盖类的事务哦! 作用于接口: 这种方法极力不推荐,因为一旦使用cglib,注解会失效。 例如以下示例: 2、 @Transactional 注解还有哪些属性呢? 接下来,我们一起看看 @Transactional 失效的场景。 1、作用在非public方法上会失效 原因是 在使用Spring AOP 代理时,会间接调用AbstractFallbackTransactionAttributeSource的方法computeTransactionAttribute获取事务信息,如果是非public就直接返回了,如下源码: 2、 propagation属性配置错误 TransactionDefinition.PROPAGATION_SUPPORTS:有没有事务无所谓 TransactionDefinition.PROPAGATION_NOT_SUPPORTED:非事务方式执行 TransactionDefinition.PROPAGATION_NEVER:有事务抛异常 3、 rollbackFor设置错误 Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。若需要在特定异常下回滚,则需要指定,比如第一个示例。 4、在同一个类中,方法调用 这个尤其被大家不熟悉,红色标出。 原因是什么,大家可以想一想,我们下一章来分析:) 5、异常被catch给吃掉了 6、数据库底层不支持事务,比如mysql的 myisam引擎。
Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?
是的
一般类上这么写
@Transactional(readOnly=true) //配置事务 查询使用 只读
public Demo{
//方法的写法 (增删改要写 ReadOnly=false 为可写)
@Transactional (propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,readOnly=false)
public void saveUser(){
}
}
Propagation.REQUIRED :有事务就处于当前事务中,没事务就创建一个事务
isolation=Isolation.DEFAULT:事务数据库的默认隔离级别
readOnly=false:可写 针对 增删改操作
注意:方法的@Transactional会覆盖类上面声明的事务
事务注解@Transactional不起作用
如果Transactional注解应用在非public修饰的方法上,Transactional将会失效。
1》在主方法上,不加@Transactional注解,在子方法上加@Transactional注解,主方法调用子方法,这种情况将会时效
2》在主方法上,加@Transactional注解,子方法上有事务操作,这时候是起作用的。
3》在类上加@Transactional注解,在方法上也加@Transactional注解,方法上的会覆盖类上面的。
在业务方法中一般不需要catch异常,如果非要catch一定要抛出throw new RuntimeException(),或者注解中指定抛异常类型 @Transactional(rollbackFor=Exception.class),否则会导致事务失效,数据commit造成数据不一致,所以有些时候try catch反倒会画蛇添足。
Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。
配置错误导致的,这种情况一般不太会出现
如果出现配置的下面的三种 propagation,事务将不会发生回滚。
ransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
跪求英文高手给翻译一段英文资料(计算机方面的)!!急等!
大意如下,仅供参考:
insightful decision making commands a premium in today's competitive world.
当今世界竞争纷呈,非凡的决策能力使您永立于不败之地!
Meeting the demand for business intelligence,advanced analytics,predictive modeling,stringent regulations and blazingly fast
reporting requires more than a traditional data management system can handle.
商务智能、高级分析、预测模型、严格管理和快速报告,面对这些需求常规的数据管理系统已无法胜任。
Sybase IQ, a highly optimized analytics server , handles the most challenging data warehousing requirements with ease.
Sybase IQ是一款经过高度优化的分析服务软件,可以轻松实现绝大多数数据仓库要求。
Designed from the start for analytics,Sybase IQ offers a unique approach compared to online transaction processing systems.
Sybase IQ具有面向分析的全新设计,与在线交易处理系统相比,它提供的解决方案独一无二。
Some analytic-type performance improvements can be gained in transactional systems through tuning and optimization
techniques, technology upgrades,or additional hardware.
可以通过调整与优化技术、技术升级或添加硬件的方式对交易系统中的部分解析型性能进行改进。
But these methods are costly and come with their own limits.
这些方法成本高昂,各有弊端。
Queries can still take hours or days to return actionable information.
查询结果需要数个小时甚至是好几天后才能看到。
The Sybase IQ analytics server combines a column-based data structure with patented indexing and a scalable grid.
Sybase IQ分析服务软件使用带有专利索引和可扩展网格的基于列的数据结构。
the more pressurized the requirements-hundreds or thousands of concurrent users,complex ad hoc queries,very high data volumes
and a high rate of change-the brighter Sybase IQ's strengths shine.
越是在并发用户多、即席查询复杂、数据量高、变化频度快的情况下,Sybase IQ的优势越能得到淋漓尽致的体现。
Sybase IQ also provides a reduction in disk and CPU requirements compared to traditional row-based database management
systems,which have to be retrofitted to support data warehousing and analytics.
与基于行的传统数据管理系统相比,Sybase IQ降低了软件对磁盘空间和CPU速度的要求;在基于行的传统数据管理系统中,我们需要不断改进系统,以满足数据仓库和分析方面的需要。