spring-04 spring事务底层原理分析

本文详细探讨了数据库事务的ACID特性,并通过示例演示了在MySQL中的隔离级别。接着,分析了Spring对事务的支持,包括API介绍、声明式事务的使用以及事务传播机制,特别强调了在不同场景下的事务传播选择。最后,指出了在同一个类中调用带事务方法的事务失效问题及其解决方案。
摘要由CSDN通过智能技术生成

1.数据库的事务的基本特性

事务是区分文件存储系统与Nosql数据库重要特性之一,其存在的意义是为了保证即使在并发情况下也能正确的执行crud操作。怎样才算是正确的呢?这时提出了事务需要保证的四个特性即ACID:

  • 原子性(atomicity)
    事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
  • 一致性(consistency)
    事务结束后系统状态是一致的;
  • 隔离性(isolation)
    并发执行的事务彼此无法看到对方的中间状态;
  • 持久性(durability)
    事务完成后所做的改动都会被持久化,即使发生灾难性的失败。

在高并发的情况下,要完全保证其ACID特性是非常困难的,除非把所有的事务串行化执行,但带来的负面的影响将是性能大打折扣。很多时候我们有些业务对事务的要求是不一样的,所以数据库中设计了四种隔离级别,供用户基于业务进行选择。

隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(SERIALIZABLE) 不可能 不可能 不可能
  • 脏读 :
    一个事务读取到另一事务未提交的更新数据
  • 不可重复读 :
    在同一事务中,多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据. 相反, “可重复读”在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据。
  • 幻读 :
    查询表中一条数据如果不存在就插入一条,并发的时候却发现,里面居然有两条相同的数据。这就幻读的问题。

1.1 演示

1.1.1 sql准备

CREATE TABLE `account` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `accountName` varchar(255) COLLATE utf8_bin NOT NULL,
  `user` varchar(255) COLLATE utf8_bin NOT NULL,
  `money` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=122 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_bin NOT NULL,
  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

1.1.2 设置连接参数

public static Connection openConnection() throws ClassNotFoundException, SQLException {
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection(DbConstant.DB_URL, DbConstant.USERNAME, DbConstant.PASSWORD);
    conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
    return conn;
}

在这里插入图片描述

1.2 数据库默认隔离级别

  • Oracle中默认级别是 Read committed
  • mysql 中默认级别 Repeatable read。另外要注意的是mysql执行一条查询语句默认是一个独立的事务,所以看上去效果跟Read committed一样。

1.3 查看mysql 的默认隔离级别

SELECT @@tx_isolation

在这里插入图片描述

2.spring对事务的支持与使用

2.1 spring 事务相关API说明

spring 事务是在数据库事务的基础上进行封装扩展 其主要特性如下

  • 支持原有的数据事物的隔离级别
  • 加入了事物传播的概念 提供多个事物的和并或隔离的功能
  • 提供声明式事物,让业务代码与事物分离,事物变得更易用

2.1.1 如何使用spring事务

spring 提供了三个接口供使用事物:

  • TransactionDefinition-
    事物定义
  • PlatformTransac
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值