使用的条件及需要注意的事项:
1.使用必须是java5或者以上;
2.@Transactional都是用在public修饰的可见类或者方法上面,如果在 private,protected 上使用的话,不会报错但是事务会不能生效;
3.建议将该注解使用在具体的类或者方法上,不要注解在接口上面,因为注解是不能被继承,这样造成编程上会相当麻烦,
注解位置个人看法:注解是在dao层(这里指的是和数据库直接联系的dao层)还是在service层?
从直观的想法来看,我们第一反应应该是在dao层加入,因为这里和数据库直接发生关系,但是只是单个的方法在事务中,eg:addUser(),那在dao层加入事务可以方便控制到,但是如果同时有2个或者更多的方法需要在一个事务中,那就不能方便的控制到,所以个人一般将事务放在service层,可以更好的控制到事务。
@Transactional
publicclass ServiceDaoImpl implements ServiceDao {
private UserDao userDao ;
public UserDao getUserDao() {
returnuserDao;
}
publicvoid setUserDao(UserDao userDao) {
this.userDao = userDao;
}
publicvoid saveUserService() {
// TODO Auto-generated method stub
System.out.println("service.....");
userDao.saveUser();
}
public User getUserService() {
// TODO Auto-generated method stub
User user = userDao.getUser(8);
return user ;
}
}
如果其中某个方法不需要开启事务可以通过如下方式在方法上进行注解:
@Transactional(propagation=Propagation.NOT_SUPPORTED)
publicvoid saveUserService() {
// TODO Auto-generated method stub
System.out.println("service.....");
userDao.saveUser();
}
@Transactional的默认值:
1. 默认的传播事务是:Propagation.REQUIRED
2. 默认的隔离级别:ISOLATION_DEFAULT
3. 事务是读写
4. 任何RuntimeException将触发事务的回滚,但是任何checkedException将不触发事务回滚;
Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是 unchecked,如果遇到checked意外就不回滚;
如何改变默认规则:
a 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
b 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
c 不需要事务管理的(只查询的)方法:
@Transactional(propagation=Propagation.NOT_SUPPORTED)
5. 事务超时默认是依赖于事务系统的,或者事务超时没有被支持。
属性 |
类型 |
描述 |
传播性 |
枚举型:Propagation |
可选的传播性设置 |
隔离性 |
枚举型:Isolation |
可选的隔离性级别(默认值:ISOLATION_DEFAULT) |
只读性 |
布尔型 |
读写型事务 vs. 只读型事务 |
超时 |
int型(以秒为单位) |
事务超时 |
回滚异常类(rollbackFor) |
一组 Class 类的实例,必须是Throwable 的子类 |
一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException的子类)才进行事务回滚。 |
回滚异常类名(rollbackForClassname) |
一组 Class 类的名字,必须是Throwable的子类 |
一组异常类名,遇到时 必须 进行回滚 |
不回滚异常类(noRollbackFor) |
一组 Class 类的实例,必须是Throwable 的子类 |
一组异常类,遇到时 必须不 回滚。 |
不回滚异常类名(noRollbackForClassname) |
一组 Class 类的名字,必须是Throwable 的子类 |
一组异常类,遇到时 必须不 回滚 |
事务的传播行为有:
@Transactional(propagation=Propagation.REQUIRED)
如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
容器不为这个方法开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY)
必须在一个已有的事务中执行,否则抛出异常
@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
事物超时设置:
@Transactional(timeout=30) // 默认是30秒
事务隔离级别:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读, 不可重复读) 基本不使用
@Transactional(isolation = Isolation.READ_COMMITTED)
读取已提交数据(会出现不可重复读和幻读)
@Transactional(isolation = Isolation.REPEATABLE_READ)
可重复读(会出现幻读)
@Transactional(isolation = Isolation.SERIALIZABLE)
串行化
MYSQL: 默认为REPEATABLE_READ级别
SQLSERVER: 默认为READ_COMMITTED
脏读 : 一个事务读取到另一事务未提交的更新数据
不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说,
后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"在同一事务中多次
读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据
幻读 : 一个事务读到另一个事务已提交的insert数据
相关推荐
在Java后端开发中,Spring框架提供了强大的事务管理能力,特别是在使用Spring Data JPA时,`@Transactional`注解使得事务处理变得简单易用。这个注解是Spring框架中的核心部分,它允许开发者声明性地控制事务边界,...
Spring3引入了基于注解的事务管理,极大地简化了事务配置,使得开发者可以在方法级别声明事务边界,这就是`@Transactional`注解的用处。本文将深入探讨这个注解以及如何在Spring3中有效地使用它。 `@Transactional`...
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。
在 Spring 框架中,@Transactional 注解是实现声明式事务的关键。通过 @Transactional 注解,可以指定事务的传播行为、隔离级别、读写控制等属性。 首先,@Transactional 注解支持 9 个属性的设置,常用的三个属性...
在Spring框架中,`@Transactional`注解是一个强大的工具,用于声明式地管理事务。它使得开发者无需显式地在代码中控制事务的开始、提交和回滚,从而提高了代码的可读性和可维护性。下面我们将深入探讨`@...
在Spring框架中,`@Transactional`注解是用于标记事务管理的重要工具,它使得开发者能够方便地在代码中声明式地控制事务的...通过实例分析和源码阅读,我们可以更深入地理解Spring事务管理机制,提升我们的编程技能。
2. 默认回滚机制:Spring 基于注解的声明式事物 @Transactional 默认情况下只会对运行期异常(java.lang.RuntimeException 及其子类)和 Error 进行回滚。 3. 数据库引擎支持:数据库引擎要支持事务,使用 InnoDB。 ...
Spring 框架中 @Transactional 注解的工作原理分析 在 Spring 框架中,@Transactional 注解是一个非常重要的概念,经常用于数据库操作。那么,@Transactional 注解是如何工作的呢?让我们深入源码分析。 首先,从 ...
在 Spring 框架中,@Transactional 注解是用于管理事务的关键工具之一。但是,在实际开发中,我们经常会遇到 @Transactional 注解失效的问题。本篇文章将详细介绍 @Transactional 注解失效解决方案,通过示例代码和...
在Spring框架中,@Transactional注解是通过AOP代理来实现事务管理的。在默认情况下,只有外部调用目标方法时,Spring才会生成代理对象来管理事务。但是,如果在同一个类中的其他方法调用有@Transactional注解的方法...
为了使用基于@Transactional的事务管理,需要在Spring中进行配置。下面是一个简单的示例: 首先,需要在Spring的配置文件中添加tx名字空间: ```xml <beans xmlns="http://www.springframework.org/schema/beans...
spring事务管理注解jar,spring-tx-3.2.4.RELEASE.jar,导入项目即可
`@Transactional`注解可以在类或方法级别上使用,用来标记需要进行事务管理的类或方法。当方法被调用时,Spring会通过AOP代理在方法执行前后插入事务管理逻辑。如果方法正常执行完毕,事务会被提交;如果方法抛出...
在Spring框架中,`@Transactional`注解是事务管理的核心组件,它允许开发者在方法级别声明事务边界。本文将深入探讨这个注解的工作原理、如何配置以及如何在遇到异常时触发事务回滚。 首先,`@Transactional`是...
在Java编程中,`@Transactional`注解是Spring框架提供的一种事务管理机制,它使得开发者能够在方法级别方便地声明事务边界。然而,在某些特定情况下,`@Transactional`可能会失效,导致事务无法正常工作。以下是一些...
解决方案非常简单,只需要在方法 A 上也声明事务注解即可。当我们在方法 A 上添加 @Transactional 注解时,事务将正常生效,方法 A 和方法 B 将自动参与到同一个事务中。 结论 ---------- 在这篇文章中,我们介绍...
在这些工具类中进行操作时,可以结合`@Transactional`注解进行事务管理。 例如,一个简单的使用`@Transactional`和`JdbcTemplate`的例子: ```java @Service @Transactional public class UserService { private ...
在 Spring Boot 应用程序中,@Transactional 注解是非常常用的,它能够帮助我们管理事务,使得数据库操作更加可靠和安全。然而,在某些情况下,使用 @Transactional 注解可能会引起 NullPointerException,这是一个...
- 配置类中需要启用事务注解处理,例如在`@Configuration`类中添加`@EnableTransactionManagement`。 通过以上介绍,我们可以看到Spring的注解事务管理提供了强大且灵活的机制,使得开发者可以专注于业务逻辑,而...