事务管理全解析:从ACID到Spring实现

一,事务

1,事务的四大特性ACID:

原子性(Atomicity)
事务是最小的执行单位,不可再分割

一致性(Consistency)
事务前后的数据都是正确的

隔离性(Isolation)
事物之间相互隔离,互不干扰(并发执行的事务彼此无法看到对方的中间状态)

持久性(Durability)
事务一旦提交不可再回滚

2,事务隔离级别

隔离级别 脏读 不可重复读 幻读
Read Uncommitted 可能 可能 可能
Read Committed 不可能 可能 可能
Repeatable Read 不可能 不可能 可能
Serializable 不可能 不可能 不可能

二,mysql,jdbc,mybast事务

mysql使用事务

开启事务:start transication

数据提:commin

数据回滚:rollback

在jdbc当中使用使用

Connection conn = dataSource.getConnection();

conn.setAutoCommit(false); // 关闭自动提交(开启事务)

通过conn调用commit 方法和 rollback方法进行事务的提交删除

java 复制代码
Connection conn = dataSource.getConnection();
try {
    conn.setAutoCommit(false); // 关闭自动提交
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("INSERT INTO table1 VALUES (...)");
    stmt.executeUpdate("UPDATE table2 SET ...");
    conn.commit(); // 提交事务
} catch (SQLException e) {
    conn.rollback(); // 回滚事务
} finally {
    conn.setAutoCommit(true); // 恢复默认设置
    conn.close();
}
 

mybatis事务管理

通过创建工厂得到sqlSession

java 复制代码
SqlSession sqlSession = sqlSessionFactory.openSession(false);
try {
    // 业务逻辑代码
    sqlSession.commit();
} catch (Exception e) {
    sqlSession.rollback();
    throw e; // 建议重新抛出异常以便上层处理
} finally {
    sqlSession.close(); // 确保资源释放
}
 

三,Spring中事务控制的API介绍

Spring为不同的orm框架提供了不同的PlatformTransactionManager接口实现类:

  • DataSourceTransactionManager:使用Spring JDBC或iBatis 进行持久化数据时使用

  • HibernateTransactionManager:使用Hibernate版本进行持久化数据时使用

1、PlatformTransactionManager

作用:是一个事务管理器,负责开启、提交和回滚事务

实现类:DataSourceTransactionManager

2、TransactionDefinition

作用:定义事务的属性

实现类:DefaultTransactionDefinition

接口里面的方法都有默认值

TransactionDefinition事务定义

1)隔离级别
default:默认值,使用数据库数据库默认的隔离级别
read_uncommitted x x x
read_committed 脏读 x x
repeatable_read 脏读 不可重复度 x
serializable 脏读 不可重复度 幻读
2)传播行为
required:默认值,methodB()会加入methodA()的事务中
supports:支持当前事务,没有事务则以非事务方式运行,适合查询
3)事务超时
default:默认值,永不超时
4)是否只读
false:默认值,记录log(效率低),适合增删改
true:不记录log(效率高),适合查询
5)回滚规则
默认值RuntimeException,即所有运行时异常都回滚

如何使用Spring事务的方法

(1)Spring 事务的 XML 配置

java 复制代码
<!--    事务管理器-->
<bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
    <property name="dataSource1" ref="dataSource"></property>
//ref="dataSource"   数据源的name
</bean>
<bean class="org.springframework.transaction.support.DefaultTransactionDefinition">
        <!--
        隔离级别:默认值是default,使用mysql默认的隔离级别repeatable_read
        传播行为:默认值required,methodB()会加入到methodA()的事务中
        事务超时:默认值是-1,永不超时
        是否只读:默认值是false,记录log适合增删改
        回滚规则:默认值RuntimeException,即所有运行时异常都回滚
    -->
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>
    <property name="isolationLevelName" value="ISOLATION_DEFAULT"></property>
</bean>
<!-- 启用注解驱动的事务管理 -->
<context:annotation-config/>

(2)事务的启动

依赖注入

PlatformTransactionManager

TransactionDefinition

PlatformTransactionManager

是 Spring 事务抽象的核心接口,定义了事务管理的核心操作契约,是事务的执行主体。其核心职责是根据事务定义规则,完成事务的开启、提交、回滚 等底层操作,具体实现由对应数据源 / 持久化框架的事务管理器

TransactionDefinition:

是事务属性的标准化定义接口,用于描述事务的行为规则,是事务管理器执行操作的依据

TransactionStatus:记录当前事务的运行状态( 是当前事务执行状态的快照对象)

java 复制代码
 //事务管理
   @Autowired
    private
    PlatformTransactionManager txManager;
   // 事务定义
    @Autowired
    private TransactionDefinition txDefinition;
    @Override
    public void transfer(String name1, String name2, float money) {
        // 开启事务
        TransactionStatus txStatus = txManager.getTransaction(txDefinition);
        try {
            userMapper.transferAdd( name1, money);
            userMapper.transferSuf(name2,  money);
            // 提交事务
            txManager.commit(txStatus);
        }catch (Exception e){
            // 回滚事务
            txManager.rollback(txStatus);
            e.printStackTrace();
        }
    }
相关推荐
2301_8000742118 分钟前
mysql DQL
数据库·sql·mysql
嘻哈baby21 分钟前
Go 函数中的参数为什么不支持默认值?
java·开发语言·jvm
西风未眠26 分钟前
ClickHouse数据库引擎引起的数据丢失
数据库·clickhouse·故障
慧都小项26 分钟前
MyEclipse 2026:当 Agent、MCP 与 Java 26 进入 Eclipse 工作流
java·eclipse·springboot·copilot·myeclipse
海浪仙人掌33 分钟前
应收账款分析如何操作?应收账款分析有哪些注意事项?
数据库·人工智能
Elastic 中国社区官方博客37 分钟前
在 Elasticsearch 中回填时间序列数据:通过批量 API 加载数月的历史指标数据
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·全文检索
Horn Still Sounds41 分钟前
Linux网络并发服务器模型与SQLite数据库学习笔记
linux·服务器·数据库
CoderYanger1 小时前
前端基础——JavaScript(基础语法)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展
京师20万禁军教头1 小时前
39面向对象(高级)-设计模式
java·开发语言·设计模式
昵称画1 小时前
POC验证怎么设计用例?不走过程的实操要点
大数据·数据库·人工智能·低代码·excel