常言道:能不麻烦就不麻烦,能简单化就简单化。但是为什么需要事务呢? 事务:用来保证一个业务的完整性,最大的优势就是回滚,并撤销正在进行的所有未提交的修改; 作用是:事务关联业务,业务中的步骤要么成功,要么全部撤销
事务必须在innodb聚集索引下使用,myisam非聚集索引事务无效。
特性,说到事务不得不说ACID 要是面试官问到事务,从ACID开始说起,就很能用自己的语言表述出来你所了解到的事务
在MYSQL下系统默认自动提交事务,单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。
手动把多条SQL语句作为一个事务执行,使用BEGIN开启一个事务,使用COMMIT提交一个事务,这种事务被称为显式事务
每个事务都是一个独立的整体,事务是最小单位,不可拆分,事务要么成功,要么回滚,不可部分成功,部分失败 什么是回滚? 事务发生回滚就是把之前所有的步骤全部撤销(这也是原理)
简单说就是:操作之前与操作之后都处于一致性的状态
数据库会给每个用户开启事务,但是一个事务不能被其他事物所影响,多个并发事务之间要相互隔离(并发读)
在事务提交时,数据的改变是永久的,即便系统故障也不会丢失。
事务的操作,一共分为两种:读事务(select)和修改事务(insert,update),如果没有隔离性操作,多个事务可以对一个事务进行修改,最终究达不到想要的效果,回想一下要是所有人都可以修改你的事务,那岂不是你的业务项目就很危险了,安全性低。 例如:
保证事务的安全性,一个回话可操作性的级别,决定能被其他会话操作的程度。 隔离性越高,效率越低,安全性越高,读并发越低
未提交读:一个事务可以读取另一个事务中未提交的数据
比如你在一个公司里,老板说要不我们更改一下上班机制(事务),不在九九六了(修改),周末双休(修改),但是还没有真正提交实施(未提交),但是你听到了修改机制的这件事情(读取未提交事务),然后你周六就真的不去上班了,事后可想而知了.....情况很严重
会出现的问题:脏读,不可重复读,幻读
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
复制代码
提交读:一个事务读取数据必须在另一个数据提交后。 你拿着银行卡去买单,卡里余额一万五,此时你老婆拿着拿着你的副卡跟朋友去购物,买了一个包一万五,并提交,此时你在用你的 卡买单时查询卡余额时,发现卡里没钱了。就是多个事务可以同时进行修改并提交,发生了提交读,不可重复读的机制。
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
复制代码
会出现的问题:不可重复读,幻读。 不会出现:脏读
可重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。幻读的出现:一个事务读取不到另一个事务insert并且提交的数据,但是可以进行修改 就是你拿着卡去买单,卡里余额一万五,但是此时你老婆拿着副卡也去买单,但是此时是用不了的,因为你正在用着这张卡,你开启了事务,你老婆买单这个事务不能对卡进行操作。
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
复制代码
会出现的问题:幻读。 不会出现:脏读,不可重复读,
最高级的事务隔离,事务不相互冲突,每一个数据行都加上了共享锁,保证安全性的同时,降低了效率,适用于安全情况要求特别高的情况下,同时可能出现超时的现象和锁竞争的现象
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
复制代码
不会出现:脏读,不可重复读,幻读
事务读取了另一个事务未提交的数据,
事务A在第一次读取数据后,事务B对数据进行了修改并提交,事务A在重复读取数据时发生改变 第二次读取的数据具体内容与第一次读取的数据内容不一致,不会发生数据行数或者列数的改变
事务A在一定范围内进行查询,事务B对A查询范围的数据进行添加或者删除数据,在事务A中可以在一定范围内查询到事务B修改后的数据 第二次读取数据与第一次读取数据的不一致,发生了行数上的改变。
-- 查看是否为自动提交
SHOW SESSION VARIABLES LIKE 'autocommit';
-- 开启或关闭自动提交,开启为1,关闭为0
SET autocommit=1;
-- 查看自动性
select @@autocommit;
-- 查看隔离性级别
SELECT @@tx_isolation;
-- 开启事务1
begin;
--开启事务1
start transaction;
-- 事务提交
commit;
-- 事务回滚
rollback;
复制代码
end》》》