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;
如果不是自动提交会怎么样?
数据不会改变。