删除
只有当事务结束才能看到对这个表的修改情况
1、事务的基本介绍
概念:
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
操作:
开启事务 start transaction
回滚 rollback
提交事务 commit
如果手动开启了事务,必须手动提交。如果将默认提交方式修改为手动提交,同样
如果没有手动开启,会默认提交。一条DML语句就是会自动提交一次事务
修改事务的自动提交方式:
查看:select @@autocommit;
如果查看结果是1,表明是自动提交。0代表手动提交
修改:set @@autocommit=0;
事务的四大特征:
原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
持久性:当事务提交或回滚后,数据库会持久保持数据
隔离性:
一致性:实务操作后,数据总量不变
**
事务的隔离级别:
概念:
事务之间具有隔离性,当不同的事务操作相同的数据时,会产生一些问题,可以通过设置隔离级别解决。
问题:
1、脏读:一个事务读到了另一个事务没有提交的数据(另一个事务读到了前一个事务开启后进行的但没有手动提交的操作)
2、不可重复读:开启的多个事务读取到的数据不一样(即;开启了两个事务,对同一组数据进行操作,其中一个事务对其进行了操作,提交后第二个事务不用提交也可以查看数据的改变。在一些情况下,希望第二个事务再提交后才能查看变化后的数据)
3、幻读:
隔离级别:
1、read uncommitted
但是会产生脏读问题 ,不可重复读问题,幻读问题
开启事务后,对数据进行的操作在另一个事务中展示,如果rollback,则对数据并没有进行修改。
2、read committed
设置后,可以解决脏读问题,也就是一个事务开启后,必须进行提交在另一个事务中才可以查询到数据的改变,也就是可以保证数据是真的进行了修改
仍有不可重复读问题和幻读问题
3、repeatable read(MYSQL默认)
设置这个隔离级别后,第二个开启的事务必须进行提交后才可以看到前一个事务对表进行的操作。
解决了不可重复读问题。
可以借助刷新理解。一个网页有所改变,我们往往需要点击刷新按钮才可以看到
4、串行化serializable
可以解决所有问题,但是是效率低。
设置为串行化以后,只有前一个事务提交之后,后一个事务才可以进行查询
注意:隔离级别越高,安全系数越高,但是效率越低
查询和设置隔离级别
/*8.0版本查询隔离级别*/
SELECT @@global.transaction_isolation;
/*设置隔离级别*/
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;