什么是事务?
事务(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)。
——顺亿(趣航编程网资深编辑)
