事务管理全解析:从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();
        }
    }
相关推荐
Dicky-_-zhang2 小时前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨2 小时前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
2301_781571422 小时前
Golang格式化输出占位符都有什么_Golang fmt占位符教程【通俗】
jvm·数据库·python
fake_ss1982 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
养肥胖虎2 小时前
RAG学习笔记(3):区分数据库检索与RAG的使用场景
数据库·ai·rag
茉莉玫瑰花茶2 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
_ku_ku_3 小时前
数据库系统原理 · 数据库应用开发 · 自学总结
数据库
未若君雅裁3 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
No8g攻城狮3 小时前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库
山峰哥3 小时前
SQL慢查询调优实战:从全表扫描到索引覆盖的完整复盘
前端·数据库·sql·性能优化