一:概念

作为单个逻辑单元执行一系列操作,要么完全执行,要么完全不执行。举例 我们需要向数据库插入3条数据(我们希望这三条数据要么全部插入成功,要么全部失败), 比如第一条数据插入成功,插入第二条数据失败(显然这已经不是一个完整的业务数据),那么第三条数据也无需执行。那么我们就可以用到事务了。

二:事务的特性和隔离级别

为了避免在事务期间发生冲突,DBMS使用锁定机制来阻止其他人访问事务正在访问的数据。(请注意,在自动提交模式下,每个语句都是一个事务,只保留一个语句的锁定。)设置锁定后,它将一直有效,直到提交或回滚事务为止。例如,DBMS可以锁定表的一行,直到对其进行更新为止。此锁定的作用是防止用户获取脏读,即在永久化之前读取值。(访问尚未提交的更新值被视为脏读因为该值可以回滚到其先前的值。如果您读取稍后回滚的值,则会读取无效值。)

隔离级别 事务 脏读 不可重复读 幻读  描述
TRANSACTION_NONE 不支持 不适用 不适用 不适用  
TRANSACTION_SERIALIZABLE 支持 防止 防止 防止  
TRANSACTION_READ_COMMITTED 支持 防止 允许 允许 在同一个事务中查询,不能确保每次查询的数据相同,即可以查询到另一个事务更新后的数据(与repeatable_read形成鲜明对比)。
TRANSACTION_REPEATABLE_READ(默认) 支持 防止 防止 允许 在同一个事务中的查询,可以确保每次读取的数据相同。即使另一个事务提交了更新也读不到更新后的数据。
TRANSACTION_READ_UNCOMMITTED 支持 允许 允许 允许 在同一个事务中的查询,可以查询到另一个事务没有提交的数据

脏读   :   读取了另一个事务没有提交的数据,默认隔离级别,即防止了别人读取到我们没有提交(commit)的数据

重复读:对一个开启了事务连接,在第一次查询一行数据(此次另一个开启的事务更新了这一条数据),与第二次查询的数据不一样。即两次查询同一条数据不一样

幻读   :对一个开启了事务连接,第一次查询的数据行数(此次另一个开启的事务的连接新增了一条),与第二次查询的行数不一样(好像产生了幻觉)。即两次查询的数量不一样

备注:事务隔离级别

备注:因在官方文档中没有找到相关的名词解释(幻读,不可重复读),故在此废弃。

备注:个人理解脏读,幻读,重复读可以上我们看到数据的整个变化过程,而不是只注重结果,故我认为这并不算是一种bug。打个比方说我种了了一亩地的西瓜,在我准备第二天收获之前我先去数了一下共有200个大西瓜。等到第二天我去收获的时候我只收获了198个,还有两个去哪里了呢?我猜测可能是被那个口渴的路人偷吃了吧,我不会纠结这两个西瓜到哪里去了。当然这也要根据业务场景分析了,如果说你第一天数的200个西瓜并兴高采烈的告诉了你的老婆大人(多线程查询同一条数据),然而收获回去只有198个,那你就要和她解释了。如果她是个通情达理的人这就不是bug,如果不是你就把它认为bug吧。

备注1:客户端设置隔离级别

mysql>  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Query OK, 0 rows affected (0.00 sec)

备注2: Java设置隔离级别

Connection.getTransactionIsolation//获取当前隔离级别
Connection.setTransactionIsolation)//设置当前隔离级别

注意:一次事务只能设置一次隔离即便

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec) mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progress

三:客户端操作方法

  备注:默认数据库事务是关闭的,即执行更新(修改)表的语句,MySQL就会将更新存储在磁盘上以使其永久化。无法回滚更改。

我们可以通过执行  SET autocommit=0; 命令设置事务开启状态,即每条更新语句都需要手动commit提交事务(只对当前session有效,即其他客户端更新操作是没有事务)

  • START TRANSACTION或 BEGIN开始新的交易。

  • COMMIT 提交当前事务,使其更改永久化。

  • ROLLBACK 回滚当前事务,取消其更改。

  • SET autocommit 禁用或启用当前会话的默认自动提交模式。

四:java手动控制

即:手动控制事务的开启和关闭

public class RawTransactions {

    private final JdbcTemplate jdbcTemplate;

    public RawTransactions(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void book(String... persons) {
//开启事务
jdbcTemplate.execute("START TRANSACTION");
for (String person : persons) {
try {
jdbcTemplate.update("insert into BOOKINGS(FIRST_NAME) values (?)", person);
} catch (RuntimeException e) {
System.out.println("----发生异常数据回滚 -----");
jdbcTemplate.execute("ROLLBACK");
break;
}
}
//提交事务
jdbcTemplate.execute("COMMIT");
}
public List<String> findAllBookings() {
return jdbcTemplate.query("select FIRST_NAME from BOOKINGS",
(rs, rowNum) -> rs.getString("FIRST_NAME"));
} }

项目地址:https://github.com/374003909/JdbcTransactions/blob/master/src/main/java/hello/RawTransactions.java

五:spring boot开启事务

即:在spring boot框架中通过注解@Transactional 实现

@Component
public class BookingService { private final static Logger logger = LoggerFactory.getLogger(BookingService.class); private final JdbcTemplate jdbcTemplate; public BookingService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
} @Transactional
public void book(String... persons) {
for (String person : persons) {
logger.info("Booking " + person + " in a seat...");
jdbcTemplate.update("insert into BOOKINGS(FIRST_NAME) values (?)", person);
}
} public List<String> findAllBookings() {
return jdbcTemplate.query("select FIRST_NAME from BOOKINGS",
(rs, rowNum) -> rs.getString("FIRST_NAME"));
} }

项目地址:https://github.com/374003909/JdbcTransactions/blob/master/src/main/java/hello/BookingService.java

测试入口:https://github.com/374003909/JdbcTransactions/blob/master/src/main/java/hello/AppRunner.java

项目地址:https://github.com/374003909/JdbcTransactions

Mysql事务开启方式(客户端+java手动+Spring Boot)的更多相关文章

  1. 框架-Java:Spring Boot

    ylbtech-框架-Java:Spring Boot 1.返回顶部 1. Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该 ...

  2. Java框架spring Boot学习笔记(六):Spring Boot事务管理

    SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.

  3. Java之Spring Boot详解(非原创)

    文章大纲 一.Spring Boot 概述二.Spring Boot 入门案例三.Spring Boot核心功能代码实战四.项目源码与资料下载五.参考文章   一.Spring Boot 概述 1. ...

  4. Java 小记 — Spring Boot 的实践与思考

    前言 本篇随笔用于记录我在学习 Java 和构建 Spring Boot 项目过程中的一些思考,包含架构.组件和部署方式等.下文仅为概要,待闲时逐一整理为详细文档. 1. 组件 开源社区如火如荼,若在 ...

  5. [Java复习] Spring Boot

    什么是Spring Boot? 传统SSH/SSM框架配置繁琐,有很多重复的模板配置,效率不高. Spring Boot快速创建可独立运行,生产级别的Spring应用程序. 主要是基于Spring家族 ...

  6. Java框架spring Boot学习笔记(三):Controller的使用

    Controller注解介绍 @Controller:处理http请求 @RestController: Spirng4之后新加的注解,其实是一个组合注解等同于@ResponseBody和@Contr ...

  7. Java框架spring Boot学习笔记(二):Hello Spring Boot、以及项目属性配置

    新建一个新建一个SpringBootTest工程 新建一个HelloController.java文件 package com.example.demo; import org.springframe ...

  8. 部署java的spring boot项目(代码外包提供)

    部署java后台的spring boot 人脸识别系统的项目 基础环境准备: 硬件:内存4g  cpu 4核  硬盘200g  虚拟机 软件:CentOS 7.6  mysql 5.7.26  jdk ...

  9. Java框架spring Boot学习笔记(一):开始第一个项目

    新建一个项目,选择Spring initializr 修改group和项目名 添加依赖包Web,MongoDB 设置保存位置和工程名 新建一个test的文件 输入代码: package com.xxx ...

随机推荐

  1. python函数注释, :与 ->

    python函数注释, :与 -> 如图:add1函数中的:意思是:函数中的参数说明    add2函数中:->意思是:函数的返回值为整型 这两种方法都是函数的注释方法,具体使用时要别人能 ...

  2. HTTP引流神器Goreplay详解【官译】

    0.背景 校验系统的正确性和可靠性时,仅靠用例场景无法覆盖全生产环境下的所有场景,需要一套引流工具,在系统正式上线前,用线上的请求测试待上线系统,在正常请求下,是否有报错:在数倍请求下,系统的性能瓶颈 ...

  3. BZOJ_4518_[Sdoi2016]征途_斜率优化

    BZOJ_4518_[Sdoi2016]征途_斜率优化 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到 ...

  4. 一种非常巧妙的读取串口数据的方法--C#

    读取不完就一直等待,读完了就立刻走,之前都是设置一个溢出时间,不管是不是早就读取完了都要在这等着,有一定的时间浪费. 注意,用之前要设置好SerialPort类的TimeOut属性:

  5. Django基础四<二>(OneToMany和 ManyToMany,ModelForm)

    上一篇博文是关于setting.py文件数据库的配置以及model与数据库表关系,实现了通过操作BlogUser,把BlogUser的信息存入后台数据库中.实际开发中有许多东西是相互联系的,除了数据的 ...

  6. 浏览器加载 CommonJS 模块的原理与实现

    就在这个周末,npm 超过了 cpan ,成为地球上最大的软件模块仓库. npm 的模块都是 JavaScript 语言写的,但浏览器用不了,因为不支持 CommonJS 格式.要想让浏览器用上这些模 ...

  7. java游戏开发杂谈 - 实现游戏主菜单

    经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...

  8. 前端笔记之ES678&Webpack&Babel(下)AMD|CMD规范&模块&webpack&Promise对象&Generator函数

    一.AMD和CMD规范(了解) 1.1传统的前端开发多个js文件的关系 yuan.js中定义了一个函数 function mianji(r){ return 3.14 * r * r } main.j ...

  9. Git操作GitHub时的Proxy配置

    无论是使用Android Studio中,VCS >> Git >> Clone, 还是直接Git Clone命令,clone GitHub项目时,出现错误提示:LibreSS ...

  10. 六大设计原则(三)DIP依赖倒置原则

    依赖倒置原则DIP(Dependence Inversion Principle) 依赖倒置原则的含义 高层模块不能依赖低层模块,二者都应该依赖其抽象. 抽象不应该依赖于细节. 细节应该依赖抽象. 什 ...