事务的实现方式有三种,JTA,Spring事务,Web Container方式。本篇讲述Spring事务。

Spring事务分为两个部分核心对象,Spring事务的实现方式。

      Spring事务实现的方式有三种。声明式,注解式,代码的方式。声明方式在实际项目中运用比较广泛,注解方式需要在每个方法上添加@Transactional注解,代码冗余度比较高。代码方式只是为了更好的理解Spring事务的机制,在实际项目中并不适用。

核心对象                                                                           

PlatformTransactionManager

事务管理接口。

  1. Transaction getTransaction(transactionDefinition) :通过事务定义对象获取事务
  2. commit(transactionStatus):提交事务
  3. rollback(transactionStatus):回滚事务。

TransactionDefinition

事务的属性或定义对象。包含的属性如下:

Isolation:事务的隔离级别。

    1. TRANSACTION_NONE:表示不支持事务。值为0,
    2. TRANSACTION_READ_UNCOMMITED:表示一个事务可以读取另外事务未提交的数据。存在脏读。值为1
    3. TRANSACTION_READ_COMMITED:表示只读取已提交的数据。防止脏读。存在重复读,幻读。值为2
    4. TRANSACTION_REPEATABLE_READ:表示在读取过程中不允许修改操作。防止一个事务多次查询得到不同的值。防止脏读,重复读,存在虚读。值为4
    5. 当为TRANSACTION_SERIALIZABLE:TODO,值为8.

Propagation:事务的传播机制。

    1. Never:表示没有事务。
    2. NOT SUPPORT:表示不支持事务。
    3. REQUIRED:为每个方法的事务创建一个域(Scope),内部方法共享外部方法的域,内部方法可以在自己的域内回滚事务,此时外部方法的事务不受内部方法事务的影响,外部事物依然可以提交。但是外部事物会捕获到UnexeceptedRollBackException。类似于语言中的函数,或方法,内部方法有自己独立的域,外部方法也有自己独立的域,内部方法可以访问外部方法的变量等等。
    4. REQUIRED NEW:为每个方法创建一个事务,彼此无关联。
    5. NESTED:为外部方法创建一个事务,多个存档点。内部方法与外部方法在同一事务内。

Timeout:超时时间。

read-only:是否是只读的事务。

TransactionStatus

表示一个新创建的事务或者已存在的事务。

  1. isNewTransaction:是否是新事务。
  2. hasSavepoint:事务是否有存放点
  3. setRollbackOnly:回滚事务
  4. isRollbackOnly:TODO
  5. flush:TODO
  6. isCompleted:事务是否执行完成。

代码示例如下:

 1 //第一步:创建事务属性对象TransactionDefinition,创建事务管理对象TransactionManager。
 2 // 创建事务属性对象
 3 DefaultTransactionDefinition def = new DefaultTransactionDefinition();
 4 def.setName("trans1");
 5 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
 6 // 创建事务管理对象
 7 DataSourceTransactionManager transcationManager = new DataSourceTransactionManager();
 8 
 9 //第二步:获取事务对象,
10 TransactionStatus status = transcationManager.getTransaction(def);
11 //第三步:实现业务逻辑代码
12 try
13 {
14     // 代码逻辑
15 }
16 catch(Exception e)
17 {
18     transcationManager.rollback(status);
19     throw e;
20 }
21 transcationManager.commit(status);
View Code

相关文章:

  • 2021-10-08
  • 2022-12-23
  • 2021-07-09
  • 2022-02-03
  • 2021-06-24
  • 2022-01-11
  • 2021-10-15
猜你喜欢
  • 2022-12-23
  • 2019-02-22
  • 2022-12-23
  • 2022-12-23
  • 2021-12-08
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案