我们知到MySQL数据库有四种隔离级别,分别是:读未提交(read uncommitted )、读已提交(read committed)、可重复读(repeatable read)、序列化\串行化(serializable)。
首先在讲隔离级别,这几个命令必须会用:
查看事务隔离级别:
select @@tx_isolation;(这是MySQL5点几版本使用的)
select @@transaction_isolation;(这是MySQL8点几的版本使用)
根据你自身MySQL的版本号选用对应的代码。
设置事务隔离级别:
set global transaction isolation level 隔离级别;
开启事务: (MySQL默认自动提交,所以我们要开启事务手动提交)
start transaction;
提交事务:(DML语句执行完之后会保存在事务性的活动日志文件,需要提交之后才会保存到数据中)
commit;
回滚事务:(将执行的DML语句回滚回来,相当于之前的DML语句作废)
rollback;
下面我先从最低的隔离级别开始:
读 未提交(read uncommitted):
假如A事务和B事务对同一张表进行操作,B事务进行了DML语句,但没有提交(commit)或者回滚(rollback),此时A事务便可以查看到B事务还没有提交的数据,就是保存在事务性活动的日志文件中的数据。这样可能会造成脏读。何为脏读:脏读就是B事务还没有提交的数据,A事务便可以查看到,在用户的眼里,A用户就会以为这条数据已经存在了,其实还没有提交,如果提交失败,便会回滚,这条数据并没有添加成功,而A用户却以为成功了。
这里你需要自己改以下隔离级别 set global transaction isolation level 隔离级别; 最后再退出数据库,再重新进入。
读 已提交(read committed):
假如A事务和B事务对同一张表进行操作,B事务进行了DML语句,但没有进行提交,那么A事务是读取不到的,它解决了脏读,但是出现了不可重复读。
可重复读(repeatable read):
A事务读取不到B事务还没有提交的数据;解决了不可重复读,但会造成幻影读(幻读),数据不够真实。mysql中默认的事务隔离级别就是这个。
序列化\串行化(serializable):
这个隔离级别是最高级别,效率最低,但是非常安全,不能并发,俩个事务不能对同一张表进行操作,需要等待A事务操作完之后,B事务才能进行操作。每次读取的数据都是最真实的。
总结:这四种隔离级别都有自己的优势,读未提交级别的效率最高,但是会脏读;读以提交不会脏读,但不可重复读;可重复读会幻读;串行化的效率太低,且非全安全,不适合多线程。一般建议使用可重复读,也就是MySQL中默认的隔离级别。