MYSQL事务隔离级别
一:先熟悉几个概念:
1:四个特性
(1)原子性:要么全部完成,要么全部不完成,不能某些完成某些不完成,不能卡在某个中间环节。
(2)一致性:数据状态一致性,假设事务失败了,那么事务回滚,数据必须回到开始之前,好像没动过一样,这叫一致性。因为有原子性所以就有一致性。原子性是因,一致性是过。
(3)持久性:事务所做的修改持久化保存,不会丢失。
(4)隔离性:多个事务同时运行时,每个事务都应该被隔离,并且不能相互干扰。换句话说,每个事务应该以某种方式被单独执行,不受其他事务的影响,以确保数据的一致性和可靠性。
好了,回到正题,事务的隔离级别,就是说的上面第(4)点隔离性,怎么隔离呢?
二:并发造成的问题
如果不隔离,那就可能遇到并发,MYSQL事务并发处理的问题:脏读、不可重复读、幻读
(1)脏读(dirty read):指从未提交的事务读取了其他事务已修改,但未提交的数据。原因:未提交
比如:事务A正在修改某个值,但还未提交,这时候事务B也过来读取这条数据,那么事务B读取到的数据就有问题,我已经修改了只是没来得及提交,你这时候闯进来读取的数据可能就是无用数据啊,这条数据被事务A执行的时候“弄脏了”,所以叫脏读。
(2)幻读(phantom read):指在同一个事务中,相同的查询操作返回了不同的结果,导致事务的结果不一致。INSERT
比如:在查询相同条件的数据时,事务A先执行查询操作,然后事务B插入了符合该条件的数据行,接着事务1再次执行相同的查询操作,结果就意外地多出了一行,好像幻觉一样。
(3)不可重复读(Non-Repeatable Reads):同一个事务内两次读取同一行数据,但是得到的结果不一致的情况。比如:事务A在多次读取的时候,其他事务把该数据修改,或者删除了。 UPDATA 和 DELETE
三:事务的4种隔离级别:读未提交、读已提交、可重复读、串行
隔离级别 | 备注 | 脏读 | 不可重复读 | 幻读 |
读未提交 READ UNCOMMITTED | 最低级别 | 可能 | 可能 | 可能 |
读已提交 READ COMMITTED | 语句级 | 不可能 | 可能 | 可能 |
可重复读 REPEATABLE READ | 事务级,默认级别 | 不可能 | 不可能 | 可能 |
串行 Serializable | 最高级,性能最差 | 不可能 | 不可能 | 不可能 |
MySQL 默认的级别是:Repeatable read 可重复读,其他主流数据库,如Oracle;SQLServer默认级别为:Read committed
四:修改隔离级别:
1:全局修改;my.cnf
1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = REPEATABLE-READ #mysql默认就是这个2:当前修改,重启mysql后失效
mysql> set tx_isolation='read-committed';