一、事务管理
1. 几种事务
- JDBC事务
try {
connection.setAutoCommit(false); // 开启事务
/*
* TODO do work
*/
connection.commit(); // 提交事务
} catch(Exception e) {
connection.rollback(); // 发生异常,回滚
} finally {
connection.close(); // 关闭连接
}
- Hibernate事务
Session session = factory.openSession(); // 获取Session
Transaction tx = null;
try {
tx = session.beginTransaction(); // 开启事务
/*
* TODO do work
*/
tx.commit(); // 提交事务
} catch (Exception e) {
if(tx != null) {
tx.rollback(); //发生异常,回滚
}
} finally {
session.close(); // 关闭连接
}
2. Spring 事务管理
-
产生的原因和一些概念:
- 可以看到各种类型的事务,其实现的代码并不一致,对于不同的框架有不同的数据库事务的实现方式。而Spring事务管理可以解决这个问题。
- 统一的事务编程模型。
- 编程式事务和声明式事务(AOP)
-
PlatformTransactionManager
- 有以下三个重要方法接口
- TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
- void commit(TransactionStatus status) throws TransactionException;
- void rollback(TransactionStatus status) throws TransactionException;
- 点击查看官方API文档
- 实现
- DataSourceTransactionManager - (JDBC的实现)
- HibernateTransactionManager - (Hibernate的实现)
- 有以下三个重要方法接口
-
TransactionDefinition
- getName:事务名称
- getIsolationLevel:隔离级别
- getPropagationBehavior:传播行为
- getTimeout:超时时间
- isReadOnly:是否是只读事务
- 点击查看官方API文档
-
TransactionStatus
- isNewTransaction:是否是新的事务
- hasSavepoint:是否有savepoint(诊断,NESTED)
- isCompleted:是否已经完成
- isRollbackOnly:事务结果是否是rollback-only
- setRollbackOnly:设置事务为rollback-only(TransactionTemplate)
- 点击查看官方API文档
3. 事务的隔离级别
- ISOLATION_READ_UNCOMMITTED : 读未提交
- ISOLATION_READ_COMMITTED∶读提交
- ISOLATION_REPEATABLE_READ : 重复读
- ISOLATION_SERIALIZABLE : 串行化
- ISOLATION_DEFAULT : 默认
4. 传播行为
假设有一个情况:事务B调用了事务A,如下图所示:
事务B调用了事务A事务关系
简单的:
- PROPAGATION_MANDATORY - 必须在一个事务中运行,不存在则抛异常
- PROPAGATION_NEVER - 不应该在事务中运行,存在则抛异常
- PROPAGATION_NOT_SUPPORTED - 不应该在事务中运行,存在则挂起
- PROPAGATION_SUPPORTS - 不需要事务,有则在事务中执行
复杂的:
需要参考以下内容
-
- PROPAGATION_REQUIRED
- 必须在事务中执行,如果不存在,则启动新事务
- 内部事务会影响外部事务
- PROPAGATION_NESTED
- 必须在事务中执行,如果不存在,则启动新事务
- 事务之间互相不影响
PROPAGATION_REQUIRES_NEW
- PROPAGATION REQUIRES_NEW
- 必须在新事务中执行,挂起当前事务
- 独立physical事务
网友评论