MySQL事务

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

不可分割的单位

事务的特点ACID

1、A 原子性

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

2、C 一致性

事务开始之前和结束之后数据库的完整性约束没有被破坏。

事务完成时,数据必须处于一致状态。事务开始前,数据库中的存储数据要处于一致状态。

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

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

3、I 隔离性

指在并发环境中,当不同事务同时操纵相同的数据时,每个事务都有各自完整的

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

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

MySQL支持的四种隔离级别

①未提交读

(允许脏读)

允许一个事务可以看到其他事务未提交的修改

②提交读

事务只能查看已经提交的修改,未提交的修改是不可见的,可以防止脏读。orcale和aql server用的就是提交读

③可重复读

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

④串行读

即锁表。完全串行化。每一个事务都隔离,读写之间会堵塞,会降低数据库的效率

脏读:另外一个事务可以看到另一个事务未提交的修改结果

事务隔离级别的作用范围

1、全局级别。对所有会话有效

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

MySQL事务_第1张图片

MySQL事务_第2张图片

不可重复读

一个事务内,多次读同一个数据

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

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

可重复读

set session TRANSACTION ISOLATION LEVEL read COMMITTED;

set global TRANSACTION ISOLATION LEVEL read COMMITTED;

flush PRIVILEGES;

begin;

update test set money=money-200 where id = 1;

select * from test;

commit;

幻读

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

以最终提交为准

丢失更新

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

以上情况如何避免

1、权限控制(最小权限)

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

生产环境最好是提交读和可重复读,测试环境无所谓(不删就行)

3、生产环境上只能允许一个人对一个事务进行操作

4、D 持久性

数据一旦提交,事务的效果将会被永久的保留在数据库中。而且不会被回滚

事务总结:

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

事务的控制语句

begin  开启事务

start transaction  显示的开启事务

commit  提交事务

commit work  提交事务

rollback  回滚事务

rollback work  回滚事务

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

savepoint 名字  创建回滚点

一个事务可以有多个回滚点

rollback to 名字  回滚到回滚点

1、多点还原 s1  s2

如果还原到s1,那么s2将会消失

如果提交,所有的还原点都会消失

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

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