跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Java中的@Transactional怎么用?详解事务、特性、实现原理和高级特性!

什么是事务?

事务(Transactional)就是将多个操作捆绑在一起,通过事务的特性来保证操作的安全性。简单来说,就是如果事务中某个操作失败了,整个事务会回滚,恢复到操作前的状态。

事务的特性(ACID特性)

  • A 原子性(Atomicity):事务中的操作要么全部完成,要么全部不完成。
  • C 一致性(Consistency):事务完成后,所有数据必须保持一致状态。
  • I 隔离性(Isolation):一个事务的执行不能被其他事务影响。
  • D 持久性(Durability):事务一旦提交,对数据库中的数据改变就是永久性的。

什么是@Transactional?

@Transactional 是Java中用于声明式事务管理的注解。它可以直接应用于类或方法上,用于控制事务的边界。

如何使用@Transactional?

使用位置:可以写在类或方法上,但不能写在接口上。

方法权限:必须是public方法。

默认情况下,遇到RuntimeException会回滚,而遇到受检查的异常不会回滚。如果想所有异常都回滚,可以添加 @Transactional(rollbackFor={Exception.class,其它异常})

@Transactional的实现原理

@Transactional 是通过JDBC事务和Spring的AOP动态代理来实现的。事务开始时,通过AOP机制生成一个代理connection对象,并将其放入DataSource实例的容器中。在事务中,所有数据库命令都通过这个代理connection执行。事务结束时,回滚代理connection上执行的数据库命令,然后关闭代理connection。

事务的隔离级别

隔离级别决定了事务的并发访问控制。常见的隔离级别有:

1. @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读、不可重复读)基本不使用2. @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)3. @Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)4. @Transactional(isolation = Isolation.SERIALIZABLE):串行化

事务的传播机制

事务的传播机制决定了事务在不同场景下的行为。常见的传播机制有:

@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没有声明事务,那就不用事务。

总结与拓展

本文详细介绍了Java中的@Transactional注解,包括其概念、特性、使用方法、实现原理以及高级特性。希望对大家有所帮助。更多关于编程的知识,可以关注趣航编程网(www.vqhf.com)。

——顺亿(趣航编程网资深编辑)

相关文章