MySQL-事务

Posted 滑稽404#

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL-事务相关的知识,希望对你有一定的参考价值。

看了点关于mysql的面经,发现自己基础薄弱,回来补一下基础,顺便学习一下索引优化和数据库并发

复习来源尚硅谷

Spring事务链接:自己写的,可能总结不大好

前置

Mysql的执行引擎中只有Innodb支持事务,同时Mysql5默认使用Innodb

事务:一条或一组SQL语句的基本单位,要不同时执行成功,要不全部失败
经典案例:A向B转账1000元,A的账户-1000元,B的账户+1000元

# account表中:
A money=3000
B money=1000
update account set money=money-1000 where id='A';
update account set money=money+1000 where id='B';

一、ACID原则

  • 原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。如:AB转账,两条语句要不都发生,要不都不发生
  • 一致性(Consistency)
    事务前后数据的完整性必须保持一致。如:转账前A、B总额为5000,转账完还是5000
  • 隔离性(Isolation)
    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability)
    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

二、使用事务

  • 提交事务,如果没有提交事务,事务执行的所有语句是不会生效的
  • 事务回滚,回到事务执行前的状态

1、Mysql样式

单纯数据库不太好演示事务

Mysql中事务是自动生成与提交的,可通过set autocommit=0关闭

# 关闭自动提交事务
set autocommit=0;
# 开启事务
start transaction;
# CRUD
update account set money=money-1000 where id='A';
update account set money=money+1000 where id='B';

# 提交事务或者回滚事务
commit;  -- rollback

2、Java中使用事务的样式

try{
	1.开启事务
	CRUD
	2.提交事务
}catch(){
	3.若发生异常,则事务回滚
}

Spring中声明式事务很方便,实际开发中基本不会使用上诉编程式事务,为了了解流程还是要知道的

3、回滚点

set autocommit=0;
start transaction;
delete from employee where id=3;
savepoint a;
delete from employee where id=5;
rollback to a;

回滚到a,只会删除id=3,而id=5的一行没有删除叼

三、隔离级别

数据库并发中,各种事务相互调用,会产生一系列问题,这时候就需要设置隔离级别

1、三个读问题

有两个事务T1、T2:

  • 脏读:T1读取了T2更新后还没有提交的字段,如果T2事务回滚,T1读到的就是临时无效的数据
  • 不可重复读:T1读取了一个字段,然后T2更新了这个字段,T1再次读取该字段时值就不同了
  • 幻读:T1从一个表中读取了一个字段,然后T2在这张表中又插入了一些新行,如果T1再次读取这张表,就会多出几行

2、隔离级别介绍

往往程序在顾忌安全的同时,会导致程序效率变低,越高的隔离级别,效率会越低
序列化,就加了一个锁,在更新查询操作执行前,插入不能进步

在这里插入图片描述
在这里插入图片描述

四、delete和truncat在事务中的区别

1、delete

set autocommit=0;
start transaction;
delete from student;
rollback;

#执行后成功回滚

2、truncat

set autocommi0;
start transaction;
truncat  table student;
rollback;

#执行后回滚不到删除前

以上是关于MySQL-事务的主要内容,如果未能解决你的问题,请参考以下文章

基础-事务

理解片段事务期间片段的生命周期方法调用

提交带有全屏片段的片段事务

使用 OnItemClickListener 列出视图片段到片段事务

Android中的片段事务问题

Android从后台堆栈中删除事务