事务管理全解析:从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();
        }
    }
相关推荐
m0_738120722 小时前
应急响应——知攻善防挖矿事件应急溯源详细过程
网络·数据库·安全·web安全
青柠代码录2 小时前
【MySQL】常用命令手册
数据库·mysql
Barkamin2 小时前
冒泡排序的简单实现
java·算法·排序算法
琢磨先生David2 小时前
数据库实例(Database Instance)是什么?
数据库
幻乐星空2 小时前
【Oracle实战】Windows Server下Oracle归档日志满与磁盘空间告急的协同处理实战
数据库·windows·oracle
熙胤2 小时前
springboot与springcloud对应版本
java·spring boot·spring cloud
行者-全栈开发2 小时前
国产数据库发展图谱:技术路线与市场竞争格局
数据库·系统架构·集群部署·信创适配·国产化数据库·技术路线
杨云龙UP2 小时前
Oracle 19c RAC多节点运行状态最简排查指南_20260316
linux·运维·服务器·数据库·sql·oracle