MySQL基础--事务
事物的原则:
* 原子性:一个事务要么全部提交完成,要么全部回滚失败,不能执行其中的一部分操作,这就是事务的原子性(针对一个事务,要么一个事务都完成,要么不开始,不能是执行一半的状态)。
* 一致性:事务的执行不能破坏数据的完整性和一致性,一个是事务在执行之前和执行之后,数据库都必须保持一致的状态。(事务执行前后数据保持一致,不会增加也不会减少。)
如果数据库系统在运行过程中发生故障,有些事物尚未完成就被迫中断,这些未完成的事物对数据库所做的修改有一部分已经写入到物理数据库中,这是数据库就处于一种不正确的状态,也就是不一致的状态。
* 持久性:一单事务提交,那么他对数据库中数据的状态的变更就会永远的保存到数据库中,--即使发生系统崩溃会机器宕机等故障,只要数据库能够重新启动,那么一定能恢复到十五成功结束的 状态。(对于事物只有提交前和提交后,若果是事务还未提交,系统发生故障,那这个事务会恢复到未执行的状态,如果发生故障之前,事务提交了,那这个事务就会提交到数据库成为已经执行的状态,且不可逆。事务 一旦提交就不可逆。)
* 隔离性:事物的隔离性是指在并发环境中,并发的食物是相互隔离的,一个事务的执行不能背其他的事物所干扰。不同的事务并发操作相同的数据时,每个事物都有各自完成的数据空间,即一个事务的内部操作及使用的数据对其 他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。(每个事物之间都相互的隔离)
* 隔离失败会产生一些问题:
1.读脏字(读取未提交):指的是一个事务读取了另一个事务未提交的事务。
2.不可重复读:在一个事务内多次读取表中的某一行数据,多次读取的的数据不一样(这不一定是错误,但是某些场合下不对)。
3.虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取的不一样(一般是行数影响,多了一行数据)。
2.事务相关语句:
-
-
- mysql 默认是开启事务自动提交的
- 关闭事物的自动提交:SET autocommit=0
- 开启事务的自动提交:SET autocommit=1
- 开启事务:START TRANSACTION (标记事务的开启,在这之后的sql语句都在同一个事务内 )
- 提交事务:COMMIT
- 回滚事务:ROLLBACK
- 保存点:
- 设置一个是事物的保存点:SAVEPOINT 保存点名称
- 回滚到某个保存点:ROLLBACK TO SAEPOINT 保存点名称
- 撤销保存点:RELEASE SAVEPOINT 保存点名称
- 一个事务的完整执行流程:
- 手动开启处理事务(关闭自动提交):SET sutocommit=0
- 开启事务:START TRANSATION
- 执行sql语句:select,delete,insert,update
- 提交事务或者回滚事务:commit/rollback
- 事务结束,开启自动提交:SET autocommit=1
-
- 事务之转账实例:
-
drop database if exists model;
-
create database springboot_model01 character set utf8 collate utf8_general_ci;
-
use model;
-
create table account(
id int(3) not null primary key auto_increment,
name varchar(30),
money decimal(9,2)
); -
insert into account(name,money)
values('one',500),('two',1000); -
select * from account;
-
set autocommit=0;
-
start TRANSACTION;
-
update account set money=money+500 where name='two';
-
update account set money=money-500 where name='one';
-
commit;
-
rollback;
-
set autocommit=1;
-
-
隔离级别描述
- READ UNCOMMITTED
允许事务读取未被其他事物提交的变更.脏读,不可重复读和幻读的问题都会出现
(读未提交数据}
-
- READ COMMITED
只允许事务读取已经被其它事务提交的变更.可以避免脏读.但不可重复读和幻读问
(读已提交数据)
题仍然可能出现
-
- REPEATABLE READ
确保事务可以多次从一个字段中读取相同的值.在这个事务持续期问,禁止其他事物
(可重复读)
对这个字段进行更新.可以避免脏读和不可重复读, 但幻读的问题仍然存在.
-
- SERIALIZABLE(串 行化)
|确保事务可以从一个表中读取相同的行.在这个事务持续期间,禁止其他事务对该表
|执行插入,更新和删除操作.所有并发问题都可以避免,但性能十分低下.
-
- Mysql支持4种事务隔离级别.Mysql默认的事务隔离级别
脏读 | 不可重复读 | 幻读 | |
READ UNCOMMITTED | × | × | × |
READ COMMITED | √ | × | × |
REPEATABLE READ | √ | √ | × |
SERIALIZABLE | √ | √ | √ |