MySQL 事务

MySQL 事务

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

不可分割的单位。

MySQL 事务

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

不可分割的单位。

C:一致性 事务开始之前和事务结束之后,保证数据库的完整性约束没有被破坏。

事务完成时,数据必须属于一致状态

事务开始前,数据存储数据处于一致的状态

进行中的事务,数据可能处于不一致的状态

在事务最终完成时,必须再次回到已知的一致状态。

I:隔离性:指在并发环境中,当不同事务同时操作相同的数据时,每个事务都有完整数据空间。

对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的

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

MySQL支持四种隔离级别:

1,未提交读,允许脏读,允许一个事务可以看到其他事务未提交的状态。

2,提交读:事务只能查看已经提交的修改,未提交的修改是不可见的。就是防止脏读 orcale sql sever 默认隔离级别

3,可重复读,也是mysql的默认隔离级别,确保如果在一个事务中执行两次相同的select语句时,都能得到相同的结果,不管其他事务是否提交。可以防止脏读以及不可重复读。

4,串行化,每一个事务都隔离,读写都阻塞。会降低数据库的效率。

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

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

1,全局级,对所有的会话有效

2,会话级:只对当前的会话有效

查询全局事务的隔离级别。REPEATABLE-READ:可重复读

show global variables like '%isolation';

select @@global.tx_isolation;

会话事务的隔离级别:

show session variables like '%isolation';

select @@session.tx_isolation;

永久全局修改

set global transaction isolation level read uncommitted;

临时

set @@global.tx_isolation='read uncommitted' 重启服务失效。

永久会话

set session transaction isolation level read uncommitted;

set @@session.tx_isolation='read uncommitted' ;

flush privileges;

不可重复读:一个事务内,多次读同一数据。

前一个事务还没有结束,另一个事务也访问该数据。

在一个事务之内两次查询到的结果不一致。读不到相同的数据内容。

先修改事务级别:把两边都改了

幻读:一个事务对一个表中的数据进行了修改,可能会涉及到表中的全部数据。

另一个事务也习惯了表中的数据,插入了一行新的数据。前一个事务发现表中还有一个数据没有修改,类似与幻觉。

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

以上的情况任何避免:

1,权限控制。最小权限select(核心)

2,根据情况来使用隔离级别。

生产环境--最好是提交读

测试环境--无所谓。其他人不允许操作

3,生产环境只能允许一个人对一个事务进行操作。其他人不允许操作。

持久性:数据一旦提交将会被永久保留在数据库中。而且不会被回滚。

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

事务的控制语句:

BEGIN

START transaction

显示的开启事务。

commit

commit work

提交事务

rollback

rollback work

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

savepront s1; 创建回滚点。一个事务可以有多个回滚点

rollback to s1;回到回滚点。提交之后还原点消失。不能更改,为了满足持久性。

1,多点还原 s1 s2

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

如果提交,所有还原点全部消失。

MySQL提交事务默认是自动提交。

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

show variables like 'autommit';

on表示开启

关闭

set autocommit=0;

如果不是自动提交会怎么样?

数据不会改变。

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