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-事务的主要内容,如果未能解决你的问题,请参考以下文章