事务管理全解析:从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();
        }
    }
相关推荐
瑞克-桑切斯7 分钟前
真实企业场景 运维安全与管理
java·网络·github
Sharewinfo_BJ29 分钟前
Power BI沿袭视图详解:从看懂链路到做影响分析
数据库·数据分析·智信bi·上北智信
老板一杯拿铁30 分钟前
Java 八股文面试详解:从基础到进阶的全面梳理
java·面试
const_qiu31 分钟前
第 2.5 章 2.5.4-2.5.5:JWT 双 Token 与声明式权限守卫
java·人工智能
l1t33 分钟前
DeepSeek总结的 DuckDB 2.0 中更简洁的变量语法
数据库·sql
bug菌33 分钟前
一个周末就想把短链服务推到 10 万 QPS,真能靠加 Redis 做到吗?
java·redis·go
撸串-研究生33 分钟前
springboot福利院管理系统73979
java·spring boot·后端·福利院管理系统
sunshine8851 小时前
集成电路(IC)设计与封测行业10大常用ERP系统分析
大数据·数据库·人工智能
fen_fen1 小时前
Jmeter5.1.1连接oracle数据库的错误复盘
数据库·jmeter·oracle
不得了zz2 小时前
04-Spring AI Alibaba ReactAgent 生产级实践:工具调用、结构化输出、HITL 与上下文管理
java·ai编程·springaialibaba