spring事务控制:
spring事务管理的四个优点:
1 提供一致的对于不同的事务管理的API
2 支持声明式事务管理 使用多
3 编程事务管理
4 优秀的整合与spring的数据访问
spring的事务管理主要是提供了三个接口来完成的:
1.org.springframework.transaction.PlatformTransactionManager
这是一个事务管理器,可以来选择相关的平台(jdbc hibernate jpa)
2.TransactionDefinition:
他定义了事务的一些相关信息:例如 隔离 传播 超时 只读等
3.TransactionStatus:
它主要描述了事务具体的运行状态.
PlatformTransactionManager:
平台事务管理器:
在不同的持久化层解决他的事务代码不一样:
jdbc:
Connection con = ...;
con.setAutonCommit(false);开启事务
con.rollback();
con.commit();
hibernate:
Session session = ...;
Transaction t = session.beginTransaction();
t.commit();
t.rollback();
PlatformTransactionManager接口API:
public interface PlatformTransactionManager{
TransactionStatus.getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status)throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
DataSourceTransactionManager 主要针对于JdbcTemplate开发 MyBatis开发
HibernateTransactionManasger主要针对于Hibernate开发
JpaTransactionManager 主要针对于JPA开发。
TransactionDefinition:
它描述的是事务的定义信息:
隔离:的程度 这个交易是孤立于其他事务的工作.
传播:通常所有事务范围内执行的代码将运行在该事务.
超时:
在TransactionDefinition中定义了大量的常量:
隔离:
static int :
ISOLATION_DEFAULT
use the default isolation level of the underlying datastore.
static int :
ISOLATION_READ_COMMITED
indicates that dirty reads are prevented ;non-repeatable reads and phantom reads can occur.
static int :
ISOLATION_READ_UNCOMMITED
indicates that dirty reads;non-repeatable and phantom reads can occur.
static int :
ISOLATION_REPEATABLE_READ
indicates that dirty reads and non-repeatable reads are prevented;phantom reads can occur.
static int :
ISOLATION_SERIALIZABLE
indicates that dirty reads,non-repeatable reads and phantom reads are prevented.
事务的四个特性:ACID 原子性 一致性 隔离性 持久性
不考虑事务的隔离性会发生:
脏读,不可重复读,虚读.
ISOLATION_DEFUALT 它使用后端数据库的默认隔离级别(spring中选项)
ISOLATION_READ_UNCOMMITTED 不能解决问题,会发生脏读 不可重复读 虚读
ISOLATION_READ_COMMITTED 可以解决脏读 会产生不可重复读与虚读。
ISOLATION_REPEATABLE_READ 可以解决脏读,不可重复读 解决不了虚读
ISOLATION_SERIALIZABLE 串行化,可以解决所有问题
对于不现的数据库,它的底层默认事务隔离级别不一样。
Oracle数据库它默认的是read_committed
Mysql数据库它默认的是repeatable_read.
超时:
static int :
TIMEOUT_DEFAULT
use the default timeout of the underlying transaction system,or none if timeout are not supported
默认值是-1 他使用的是数据库默认的超时时间.
传播:
他解决的是两个被事务管理的方法互相调用问题,他与数据库没有关系,是程序内部维护的问题
最常用的:
PROPAGATION_REQUIRED 默认值 两个操作处于同一个事务,如果之前没有事务,新建一个事务
PROPAGATION_REQUIRES_NEW 两个操作处于不同的事务
PROPAGATION_NESTED
它是一种嵌套事务,它是使用SavePoint来实现的。事务回滚时可以回滚到指定的savepoint,注意:它只对DataSourceTransactionManager有作用
以下了解
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
PROPAGATION_NOT_SUPPORTED 以非事务运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务运行,如果有事务存在,抛出异常
TransactionStatus:
他定义了事务状态信息,在事务运行过程中,得到某个时间点的状态.
public interface TransactionStatus extends SavePointManager{
boolean isNewTransaction();
boolean hasSavepoint();
void setRollbackOnly();
boolean isRollbackOnly();
void flush();
boolean isCompleted();
}
声明式事务管理:
事务管理方式:
基于AOP对目标进行代理 添加around环绕通知.
基于annotation声明式事务管理方案:
可以使用@Transaction来在类或者方法上添加声明式事务管理.
注意:需要在applicationContext.xml文件中使用
相当于开启注解事务控制
方法或者类上加@Transactional()注解