事务管理全解析:从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();
        }
    }
相关推荐
文丑颜不良啊1 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼1 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
文丑颜不良啊3 小时前
LeetCode2161~2180题目解析
java·leetcode
文丑颜不良啊5 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发5 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
lambo mercy5 小时前
AI智能租房助手
数据库
天天被压力5 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力6 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A6 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵6 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml