一.什么是事务?
事务就是由单独单元的一个或多个sql语句组成,在这个单元中,每个sql语句都是相互依赖的。而整个单独单元是作为一个不可分割的整体存在。往通俗的讲,事务就是一个整体,里面的内容要么都执行成功,要么都不成功。不可能存在部分执行成功而部分执行不成功的情况。对于MySQL存储引擎,Innodb支持事务,而myIsam等不支持事务。
二.事务操作
例如:
三.事务的四大特性(ACID)
- 原子性:每个事务都是不可分割的最小单元,事务操作只有都发生和都不发生两种情况。
- 一致性:事务必须使数据库从一个一致状态变换到另外一个一致状态,中间状态是不可见的。
- 隔离性:事务的执行不会被其它事务干扰。即并发的事务之间互不干扰。
- 持久性:事务一旦提交成功,对数据库的数据改变是永久的。
四.事务分类
事务分为隐式事务和显式事务两种。我们的DML语句(insert、update、delete)就是隐式事务。
隐式事务:该事务没有明显的开启和结束标记,它们都具有自动提交事务的功能。
显示事务:该事务具有明显的开启和结束标记;也是本文重点要讲的东西。使用显式事务的前提是你得先把自动提交事务的功能给禁用。禁用自动提交功能就是设置autocommit
变量值为0(0:禁用 1:开启)
五.并发事务问题
并发事务问题:A事务和B事务在操作数据库表时,所引发的一些问题。
- 脏读:一个事务读到另一个事务还没有提交的数据
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但插入数据时,又发现数据已经存在
为了避免以上出现的各种并发问题,我们就必然要采取一些手段。mysql数据库系统提供了四种事务的隔离级别,用来隔离并发运行各个事务,使得它们相互不受影响,这就是数据库事务的隔离性。
六.事物隔离级别
mysql中的四种事务隔离级别如下:
了解: oracle支持两种事务隔离级别:read committed、serializable。
oracle默认的事务隔离级别是:read committed。
mysql的默认事务隔离级别是:repeatable read。
注:事务隔离级别越高,数据越安全,但性能越低