Spring -事务管理

 

Java事务导引

事务:正确执行一系列操作(或动作),使得数据库从一种状态转移成另一种状态,保证操作全部成功,或者全部失败

事务原则:服从ISO/IEC指定的ACID原则

         ISO/IEC:14443 识别卡 -- 非接触式集成电路卡

         原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

DataSource

 

Java事务:在Java编写的程序或者系统中,实现ACID的操作

实现范围:

通过JDBC相应方法间接实现对数据库的增删改查,把事务转移到Java代码中控制,确保事务要么全部执行成功,要么撤销不执行

总结:Java事务机制和原理就是确保数据库操作的ACID特性

Java事务类型:

JDBC事务:Connection对象控制,包括手动模式和自动模式---------局限在一个数据库连接,但是使用简单

         JTA(Java Transaction API)事务:与实现无关,与协议无关的API------------功能强大,可跨越数据库或DAO,使用复杂

         容器事务:应用服务器提供,且大多基于JAT完成(通常基于JNDI,API复杂)-----------J2EE应用服务器提供的事务管理,局限于EJB

Spring事务核心接口

PlatformTransactionManager接口

 

Spring事务属性

是否是新事务(isNewTransaction)
是否有savepoint(诊断,NESTED):hasSavepoint
是否完成(isCompleted)

 

事务属性范围

 

事务属性定义

  

事务读取类型

脏读

不可重复读

幻读

事务隔离级别(IsolationLevel)

 

spring事务传播行为(PropagationBehavior)

 

事务是否只读(isReadOnly)

Oracle的”readOnly”没有作用,不影响增删改查

MySQL的”readOnly”为true,只能查,增删改抛出异常

事务超时(Timeout)
事务回滚

默认情况下,事务遇到运行期异常才会回滚,而在遇到检查型异常不回滚

自定义:

1、  声明事务在遇到特定的检查型异常时像遇到运行时异常那样回滚

2、  声明事务在遇到特定的异常不回滚,即使是运行时异常

事务接口

通过事务管理器获得TransactionAtatus实例

控制事务在回滚或者提交的时候需要应用对应的事务状态

Spring事务接口

编程式事务管理

事务管理器(PlatformTransactionManager)

1、  类似应用JTA UserTransaction API方式,异常处理更简洁

2、  核心类:spring事务管理的三个接口类以及JDBC template类

 

模板事务(TransactionTemplate)

JDBC Template类

编程事务步骤:

1、  需要有效的数据源,具体数据源根据实际情况创建

2、  创建编程事务管理对象

定义TransactionTemplate

 

使用TransactionTemplate

有返回值

 

没有返回值

 

如果需要处理异常

 

3、  业务逻辑:基于JDBC template完成业务处理

声明式事务管理(AOP)

XML方式配置

1、  添加schema

 

2、  定义事务管理器

 

3、  定义事务Advice

 

<tx:method/>

Name:匹配的函数名称、支持*匹配

Propagation:事务传播行为

Isolation:事务隔离级别

Timeout:超时

Read-only:是否只读事务

Rollback-for:触发回滚的异常,逗号分隔

No-rollback-for:不触发回滚的异常,逗号分隔

4、  定义pointcut

 

注意:注入事务的类,还需要注入DataSource的属性

注解方式配置

1、  添加schema

2、  定义事务管理器

 

3、@Transactional

value:使用的TransactionManager

propagation:事务传播行为

isolation:事务隔离级别

timeout:超时

readOnly:是否只读事务

RollbackFor:触发回滚的异常类对象数组

RollbackForClassName:触发回滚的异常类名称数组

noRollbackFor:不触发回滚的异常类对象数组

noRollbackForClassName:不触发回滚的异常类名称数组

 

配置类型:

5种:独立代理;共享代理;拦截器;(这三种2.0版本之后不推荐使用)

         Tx拦截器;全注释

使用范围

编程式事务在代码量比较小的时候使用,声明式事务在事务操作量多时候常常使用

猜你喜欢

转载自www.cnblogs.com/thyHome/p/9075017.html