事务的实现方式有三种,JTA,Spring事务,Web Container方式。本篇讲述Spring事务。
Spring事务分为两个部分核心对象,Spring事务的实现方式。
Spring事务实现的方式有三种。声明式,注解式,代码的方式。声明方式在实际项目中运用比较广泛,注解方式需要在每个方法上添加@Transactional注解,代码冗余度比较高。代码方式只是为了更好的理解Spring事务的机制,在实际项目中并不适用。
核心对象
PlatformTransactionManager
事务管理接口。
- Transaction getTransaction(transactionDefinition) :通过事务定义对象获取事务
- commit(transactionStatus):提交事务
- rollback(transactionStatus):回滚事务。
TransactionDefinition
事务的属性或定义对象。包含的属性如下:
Isolation:事务的隔离级别。
- TRANSACTION_NONE:表示不支持事务。值为0,
- TRANSACTION_READ_UNCOMMITED:表示一个事务可以读取另外事务未提交的数据。存在脏读。值为1
- TRANSACTION_READ_COMMITED:表示只读取已提交的数据。防止脏读。存在重复读,幻读。值为2
- TRANSACTION_REPEATABLE_READ:表示在读取过程中不允许修改操作。防止一个事务多次查询得到不同的值。防止脏读,重复读,存在虚读。值为4
- 当为TRANSACTION_SERIALIZABLE:TODO,值为8.
Propagation:事务的传播机制。
- Never:表示没有事务。
- NOT SUPPORT:表示不支持事务。
- REQUIRED:为每个方法的事务创建一个域(Scope),内部方法共享外部方法的域,内部方法可以在自己的域内回滚事务,此时外部方法的事务不受内部方法事务的影响,外部事物依然可以提交。但是外部事物会捕获到UnexeceptedRollBackException。类似于语言中的函数,或方法,内部方法有自己独立的域,外部方法也有自己独立的域,内部方法可以访问外部方法的变量等等。
- REQUIRED NEW:为每个方法创建一个事务,彼此无关联。
- NESTED:为外部方法创建一个事务,多个存档点。内部方法与外部方法在同一事务内。
Timeout:超时时间。
read-only:是否是只读的事务。
TransactionStatus
表示一个新创建的事务或者已存在的事务。
- isNewTransaction:是否是新事务。
- hasSavepoint:事务是否有存放点
- setRollbackOnly:回滚事务
- isRollbackOnly:TODO
- flush:TODO
- 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);