数据库事务与其隔离级别

来源:互联网 发布:竞价推广软件 编辑:程序博客网 时间:2024/06/05 22:35

这个问题面试覆盖率估计超过50%,这里分两步分享我的理解

一、数据库事务

二、事务隔离级别

这里用mysql的innodb数据库引擎

======相关链接=====

mysql相关分享请点击浅谈mysql


进入正题,什么是数据库事务?

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。

事务有四个特性,这四个特性和隔离级别息息相关

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。 

一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。 

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。 

持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。

如果不满足事务隔离级别,会出现:脏读,不可重复读,幻读这几种情况

脏读:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

幻读:幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

下面说一下隔离级别,mysql有以下四种隔离级别

① Read uncommitted

② Read committed

③ Repeatable read

④ Serializable

通过一张图看这四种隔离级别分别可以防止哪些问题发生


这里补充下mysql默认的隔离级别是Repeatable read,也就可以可重复读