事务的基本概念

  事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序 执行逻辑单元(Unit)。一方面,当多个应用程序并发访问数据库时,事务可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。另一方面,事务为数据库操作序列提供了一个从失败中恢复到正常状态的方法, 同时提供了数据库即使在异常状态下仍能保持数据一致性的方法。

  事务具有四个特征,分别是原子性(Atomicity )、一致性(Consistency )、隔离性(Isolation) 和持久性(Durability),简称为事务的ACID特性。

  • 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):事务前后数据的完整性必须保持一致。
  • 隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

  分析源码前,先从理论上大概分析下,纯JDBC操作数据库的基本步骤:

  1. 获取连接 Connection conn = DriverManager.getConnection()
  2. 开启事务conn.setAutoCommit(true/false);
  3. 执行CRUD
  4. 提交事务/回滚事务 conn.commit() / conn.rollback();
  5. 关闭连接 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 }
Transactional

相关文章: