数据库-事务

Mysql的事务:

事务是一种机制,一个操作序列,包含了一组数据库的操作命令,所有命令都是一个整体,向系统提交或者撤销的操作,要么都执行,要么都不执行,他是一个不可分割的单位

事务的特点ACID:

A:原子性 作为一个最小单位 事务里的所有条件都是一个整体,不可分割,要么都成功,要么都失败

C:一致性 事务开始之前和事务结束之后,数据库的完整性约束没有被破坏,事务完成时,数据必须处于一致状态 事务开始前,数据库种的存储数据处于一致状态 事务进行中,数据可能处于不一致的状态 在事务最终完成时,必须在次回到已知的状态

脏读:一个事务没有提价,另一边没有显示

I:隔离性 指在并发环境中,当不同事务同时操作相同的数据时,每个事务都有各自完整的数据空间,对数据进行修改的所有的并发事务是彼此隔离的,表明事务必须是独立的

修改数据的事务可以在另一个使用相同的数据的事务开始之前访问这些数据,或者在另一个使用相同的事务结束之后访问这些数据   

Mysql支持4种隔离级别:

  1. 未提交读:允许脏读,允许一个事务可以看到其他事务未提交的修改
  2. 提交读:事务只能查看已经提交的修改,未提交的修改是不可见的,防止脏读orcale sql server
  3. 可重复读:也是mysql的默认隔离级别,确保如果在一个事务中执行两次相同的select语句时,都能得到相同的结果,不管其他事务是否提交修改,可以防止脏读以及不可重复读
  4. 串行读,锁表,完全串行化,每一个事务都隔离,读写都阻塞,效率最低,没人用。

脏读:

另外一个事务能够看到另一个事务未提交的修改结果

演示脏读:

客户1:

数据库-事务_第1张图片

客户2:

数据库-事务_第2张图片

怎么解决脏读,两边都退出数据就会恢复

事务隔离级别的作用范围:

  1. 全局级,对所有的会话有效
  2. 会话级,只对当前的回话有效

持久性:数据库提交,事务的效果将会被永久的保存在数据库当中,而且不会回滚

主从复制

高可用

备份

权限控制

查询全局事务的隔离级别:

show global variables like '%isolation';

select @@global.tx_isolation;

数据库-事务_第3张图片

例如:

数据库-事务_第4张图片

查看和设置会话事务的隔离级别:

show session VARIABLES like '%isolation';

select @@session.tx_isolation;

数据库-事务_第5张图片

例如:

数据库-事务_第6张图片

修改全局事务隔离级别:(未提交读)

set global transaction isolation level read UNCOMMITTED;

临时设置:(重启就失效)

set @@global.isolation='read UNCOMMITTED’;

修改事务的隔离级别(未提交读):

数据库-事务_第7张图片

不可重复读:

一个事务内,多次读同一数据,前一个事务还没有结束,另一个事务也访问该数据,在一事务内,两次查询到结果不一致,读不到相同的数据内容

演示:

数据库-事务_第8张图片

数据库-事务_第9张图片

幻读:

一个事务对一个表中的数据进行了修改,可能会涉及到表中的全部数据,另一个事务也修改了表中的数据,插入了一行新的数据,前一个事务会发先表中还有数据没有修改,类似于幻读

演示:

前提:主键约束改为提交读,否则实验效果出不来

数据库-事务_第10张图片

丢失更新:

两个事务同时修改一条记录,A先记录,B也修改了记录,B一旦提交会覆盖A的结果。

演示:

数据库-事务_第11张图片

以上这些情况如何避免:

  1. 权限控制
  2. 根据情况来使用隔离级别

生产环境--最好是提交读或者是提交读和可重复读混合

测试环境--无所谓

  1. 尤其是生产环境,只能允许一个人对一个事务进行操作,其他人是不允许操作的

总结事务:在事务管理当中,原子性是基础,隔离性是手段,一致性是我们的目的,持久性是我们最终的结果

事务的控制语句:

Begin;

Start transaction;

显示开启事务

Commit;

Commit work;

提交事务

Rollback;

Rollback work;

回滚 撤销正在进行的未提交的修改

Savepoint s1;

创建回滚点,一个事务可以有多个回滚点

Rollback to s1;

回到还原点

演示创建回滚点:

数据库-事务_第12张图片

数据库-事务_第13张图片

数据库-事务_第14张图片

提交之后就不能回滚

如何设置多个还原点:

数据库-事务_第15张图片

数据库-事务_第16张图片

数据库-事务_第17张图片

数据库-事务_第18张图片

回滚小结:

一旦提交事务提交,事务的回滚点,全部消失

多点还原,s1 s2

如果说还原到s1, s2将消失

一旦提交事务提交,事务的回滚点,全部消失

Mysql提交事务默认是自动提交

可以用set来设置mysql提交方式:

show variables like 'autocommit';

查看提交方式

Set autocommit=0;

修改

你可能感兴趣的:(数据库)