Mysql基础-事务

文章目录

      • 1.什么是事务
      • 2.事务的四个特性
      • 3.事务的开始与结束
      • 5、脏读、脏数据
      • 6、锁
      • 7.并发事务引发的4个问题
      • 8.隔离级别

1.什么是事务

一个数据库事务由一条或者多条sql语句构成,它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功,要么全部执行失败
事务是保证数据的完整性和一致性的重要手段
事务类型
DML事务:由一条或者多条DML语句构成
DDL事务:总是由一条DDL语句构成
DCL事务:总是由一条DCL语句构成DML事务:有一条或多条DML语句构成

2.事务的四个特性

ACID
原子性:事务操作时最小的操作单元,操作要么成功,要么失败
COMMIT 提交 : 让缓存里的数据写到磁盘
ROLLBACK 回滚  :撤销缓存中的操作

一致性:事务执行结果必须是从一个一致性状态到另个一个一致性状态

隔离性:每个事务之间互相是不会被干扰的 

持久性:事务一旦提交,他对数据库数据库改变时永久的,事务的操作会永久落盘

MVCC:多版本并发控制 --》大并发操作的时候,提高读写的性能,能保存数据的一致性 --行锁、事务

3.事务的开始与结束

有一个变量 autocommit =1 ,这个变量存在的意义是每当你执行sql语句,mysql将你执行的sql语句自动提交

当时在执行DDL、DCL语句的时候,就算你关闭了autocommit也不会影响,因为他会在你执行之前,自动执行一句commit语句

隐形开始与显性开始

隐性开始:
隐性开始就是当你提交事务时,mysql语句会自动提交commit操作,不需要你手动进行

显性开始:
当你输入start transcation;后,当你执行mysql语句后,执行结果只是保存在你这个事务的buffer pool里,而没有落盘,(事务的隔离性),并且sql查询时时直接查询磁盘的数据,这就导致别的mysql连接用户查询不到你刚刚执行的操作,你需要再执行一句commit; 让事务落盘(持久性)(或者rollback 将语句撤销),这样别人才会访问到你执行的事务操作,但是当执行完后,下一条数据库语句会自动回归隐性开始

SavePoint

SAVEPOINT a;
简历保存点,当你需要回滚时,直接 rollback to a 这样就回到了a时的操作

savepoint a;
insert into  t3 values(3,'cali')

rollback to a;
这样就会就会回到插入之前的状态

5、脏读、脏数据

脏数据:被事务修改后但是没有被提交的数据

胀读:一条事务可以查看另一条数据没有执行的数据

这些操作都是在内存中进行

6、锁

死锁: 比如访问某个资源需要两个条件,A事务持有一个条件,B事务持有另一个条件,这样资源被占用了两个都不满足放问
如何预防死锁
1.使用另外的程序来检查是否存在死锁,干预,杀死某些进程
2.设计程序的时候,考虑获得
3.队列

活锁:活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。


读锁: 读数据的时候,给每行加一个锁,读锁就是共享锁,当前会话与其他会话可以读表但是不能修改表
写锁: 写数据的时候,给某行加一个锁,写锁是互斥锁,在写未释放之前,既不能读也不能写

意向锁:
共享锁:    ---> 读锁
互斥锁:	---> 写锁

锁的意义:大并发的情况下,为了保存数据的一致性。需要对资源进行管控,需要使用锁,解决资源竞争问题

select * from t2 lock in share mode ;

7.并发事务引发的4个问题

脏读:事务读取到另一个事务未提交的数据
不可重复读:update和replace造成,事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

幻读 :insert和delete造成、两次查询的条数不一样
例子:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

丢失更新:两个事务同时对一个数据进行更新,然后提交的时候先提交的被后提交的覆盖

8.隔离级别

每个事务都有一个隔离级别(isolation level),它规定了并发运行的两个事务之间是否允许发生上面的问题

Mysql基础-事务_第1张图片

read  uncommitted
read  committed
repeatable read 
serializable :

两种查看隔离级别的方式:

select @@global.tx_isolation,@@tx_isolation
show variables like '%tx_isolation%'

table read
serializable :


两种查看隔离级别的方式:

select @@global.tx_isolation,@@tx_isolation
show variables like ‘%tx_isolation%’




你可能感兴趣的:(Mysql学习)