事务的基本概念
事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序 执行逻辑单元(Unit)。一方面,当多个应用程序并发访问数据库时,事务可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。另一方面,事务为数据库操作序列提供了一个从失败中恢复到正常状态的方法, 同时提供了数据库即使在异常状态下仍能保持数据一致性的方法。
事务具有四个特征,分别是原子性(Atomicity )、一致性(Consistency )、隔离性(Isolation) 和持久性(Durability),简称为事务的ACID特性。
- 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency):事务前后数据的完整性必须保持一致。
- 隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
分析源码前,先从理论上大概分析下,纯JDBC操作数据库的基本步骤:
- 获取连接 Connection conn = DriverManager.getConnection()
- 开启事务conn.setAutoCommit(true/false);
- 执行CRUD
- 提交事务/回滚事务 conn.commit() / conn.rollback();
- 关闭连接 conn.close();
@Transactional分析
1 @Target({ElementType.TYPE, ElementType.METHOD}) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Inherited 4 @Documented 5 public @interface Transactional { 6 7 /** 8 * Alias for {@link #transactionManager}. 9 */ 10 @AliasFor("transactionManager") 11 String value() default ""; 12 13 /** 14 * A <em>qualifier</em> value for the specified transaction. 15 * 事务管理器 16 */ 17 @AliasFor("value") 18 String transactionManager() default ""; 19 20 /** 21 * The transaction propagation type. 22 * 传播行为定义,枚举类型,是spring独有的事务行为设计,默认为PROPAGATION_REQUIRED(支持当前事务,不存在则新建) 23 */ 24 Propagation propagation() default Propagation.REQUIRED; 25 26 /** 27 * The transaction isolation level. 28 * 隔离级别,对应数据库的隔离级别实现,mysql默认的隔离级别是 read-committed 29 */ 30 Isolation isolation() default Isolation.DEFAULT; 31 32 /** 33 * The timeout for this transaction (in seconds).超时时间,默认使用数据库的超时,mysql默认的事务等待超时为5分钟 34 */ 35 int timeout() default TransactionDefinition.TIMEOUT_DEFAULT; 36 37 /** 38 * A boolean flag that can be set to {@code true} if the transaction is 39 * effectively read-only 是否只读,默认是false 40 */ 41 boolean readOnly() default false; 42 43 /** 44 * Defines zero (0) or more exception {@link Class classes}, which must be subclasses of {@link Throwable}, indicating which exception types must cause 45 * a transaction rollback. 异常回滚列表,默认的是RuntimeException异常回滚 46 */ 47 Class<? extends Throwable>[] rollbackFor() default {}; 48 49 /** 50 * Defines zero (0) or more exception names (for exceptions which must be a subclass of {@link Throwable}), indicating which exception types must cause 51 * a transaction rollback. 导致事务回滚的异常类名字数组 52 */ 53 String[] rollbackForClassName() default {}; 54 55 /** 56 * Defines zero (0) or more exception {@link Class Classes}, which must be subclasses of {@link Throwable}, indicating which exception types must 57 * <b>not</b> cause a transaction rollback.不会导致事务回滚的异常类数组 58 */ 59 Class<? extends Throwable>[] noRollbackFor() default {}; 60 61 /** 62 * Defines zero (0) or more exception names (for exceptions which must be a subclass of {@link Throwable}) indicating which exception types must <b>not</b> 63 * cause a transaction rollback. 不会导致事务回滚的异常类名字数组,必须继承自Throwable 64 */ 65 String[] noRollbackForClassName() default {}; 66 67 }