Spring事务详解
Spring 事务王国概览 (opens new window)
Spring 事务管理—上 (opens new window)
Spring 事务管理—中 (opens new window)
Spring 事务管理—下 (opens new window)
Spring 事务扩展篇 (opens new window)
# 事务创建涉及到一些属性的配置,如:
- 事务的隔离级别
- 事务的传播行为
- 事务的超时时间
- 是否为只读事务
# 事务家族
事务的大家族中常会出现下面几个重要的家庭成员:
- Resource Manager: 简称 RM,可以将其看做是数据的管理员,例如,数据库服务器(mysql),消息服务器等
- Transaction Processing Monitor: 简称 TPM 或者 TP Monitor,他负责在分布式场景下协调多个 RM 的事务处理。
- Transaction Manager: 简称 TM,它可以认为是 TP Monitor 的核心模块,直接负责多 RM 之间事务处理的协调工作,并提供事务界定,事务上下文传播等功能接口。
# 三大主要类
PlatformTransactionManager: 负责界定事务边界
public interface PlatformTransactionManager extends TransactionManager { TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
1
2
3
4
5
6TransactionStatus : 记录整个事务处理过程中的事务状态
SavepointManager:
mysql 中 savepoint 的用法吧:
ET autocommit=0; START TRANSACTION; DELETE FROM test1 WHERE NAME='大忽悠'; SAVEPOINT a;#设置保存点 DELETE FROM test1 WHERE NAME='小朋友'; ROLLBACK TO a;#回滚到保存点
1
2
3
4
5
6SAVEPOINT的好处在于可以选择回滚一部分事务
TransactionDefinition :主要定义了事务属性相关配置:
- 事务的隔离级别
- 事务的传播行为
- 事务的超时时间
- 是否为只读事务
# TransactionTemplate:
是 Spring 提供的进行编程式事务管理的模板方法类,他直接继承了 DefaultTransactionDefinition。
TransactionTemplate 的设计思想和 JDBCTemplate 一致,是通过模板方法加回调接口的方式,将通用的事务处理代码,和资源管理封装为模板方法,而将需要变化的,并且需要被事务包裹的代码,以回调接口的形式传递出去。
# 示例
public class TransactionMain {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
test();
}
private static void test() {
DataSource dataSource = getDS();
JdbcTransactionManager jtm = new JdbcTransactionManager(dataSource);
//JdbcTransactionManager根据TransactionDefinition信息来进行一些连接属性的设置
//包括隔离级别和传播行为等
DefaultTransactionDefinition transactionDef = new DefaultTransactionDefinition();
//开启一个新事务---此时autocommit已经被设置为了false,并且当前没有事务,这里创建的是一个新事务
TransactionStatus ts = jtm.getTransaction(transactionDef);
//进行业务逻辑操作
try {
update(dataSource);
jtm.commit(ts);
}catch (Exception e){
jtm.rollback(ts);
System.out.println("发生异常,我已回滚");
}
}
private static void update(DataSource dataSource) throws Exception {
JdbcTemplate jt = new JdbcTemplate();
jt.setDataSource(dataSource);
jt.update("UPDATE Department SET Dname=\"大忽悠\" WHERE id=6");
throw new Exception("我是来捣乱的");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
编辑 (opens new window)
上次更新: 2024/04/19, 08:52:45
- 01
- idea 热部署插件 JRebel 安装及破解,不生效问题解决04-10
- 02
- spark中代码的执行位置(Driver or Executer)12-12
- 03
- 大数据技术之 SparkStreaming12-12