一、什么是MySQL的事务?
当多个用户访问同一份数据时,一个用户再更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状态变更为另一个一致性状态,这时就有必要引入事物的概念。MySQL提供了多种存储引擎支持事务,支持事务的存储引擎有InnoDB和BDB。
二、知识剖析
1.事务的4种特性:
(1)原子性:事务中所有的操作视为一个原子单元,即对于事务所进行的数据修改等操作只能是完全提交或者是完全回滚。
(2)一致性:事务完成时,必须使用所有的数据从一种一致性状态变更为良一中一致性状态,所有的变更都必须应用于事务的修改,以确保数据的完整性。
(3)隔离性:一个事务中操作语句所做的修改必须与其他事务所做的修改相隔离。
(4)持久性:事务完成之后,所做的修改是对数据的影响是永久的,即使是系统重启或者出现系统故障数据依然可以恢复
2.REDO日志:
事务执行时需要将执行的事务日志写入到日志文件中,对应的文件为REDO日志
3.UNDO日志
与REDO日志相反,UNDO日志主要用于事务异常时的数据回滚。
三、常见问题
1.事务控制语句
(1).查看当前会话隔离级别
select @@tx_isolation;
(2).查看系统当前隔离级别
select @@global.tx_isolation;
(3).设置当前会话隔离级别
set session transaction isolatin level repeatable read;
(4).设置系统当前隔离级别
set global transaction isolation level repeatable read;
2.事务的几种隔离级别
(1)READ-UNCOMMITTED(读取未提交内容)(脏读)
(2)READ-COMMITTED(读取提交内容):满足了格力的简单定义:一个事务从开始到提交前所做的任何改都是不可见的,事务之只能看见已提交事务所做的改变
(3)REPEATEABLE-READ(可重复读):这是MySQL的默认的事务管理级别,能同时保同一个事务的多个实例在并发读数据时,会看到同样的数据行,理论上会导致另一个问题:幻读。
(4)Serializabel(可串行化):这是最高的隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决幻读 的问题。
四、深度思考
Serilizabel是事务隔离最高的级别,为什么不是默认的事务级别?
serilizable串行是事务隔离的最高级别,他是不能同时进行两个事务的,也就是每个事务都要排队,一个事务进行完成commit之后才能进行下一个事务。这是就相当于操作数据库只能一个人操作完之后才能进行一下一个人的操作。
五、参考教程
六、更多讨论
InnoDB的锁机制
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧 !