read-uncommitted 对应 P1 脏读;
read-committed 对应 P2 不可重复读;
repeatable-read 对应 P3 幻读;MYSQL默认级别
serializable 没有与之对应的异常现象。(发生大量锁,超时,等待)
set tx_isolation='repeatable-read';
select @@tx_isolation;
start transaction;
*****mysql select * from users....
commit;
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`score` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `users` (`id`, `score`) VALUES ('1', '90');
INSERT INTO `users` (`id`, `score`) VALUES ('2', '60');
INSERT INTO `users` (`id`, `score`) VALUES ('3', '50');
数据库结构
+------+------+
| id | score|
+------+------+
| 1 | 95 |
| 2 | 60 |
| 3 | 50 |
+------+------+
脏读:
读取到了未提交的数据
A事务:select score from users where id=2
-----B事务:update users set score = 85 where id=2
A事务:select score from users where id=2 //读到了没有被commit的值85
A事务的执行过程被B事务影响了
不可重复读
是说读的结果的行数不变或者减少,结果的内容发生变化;
A事务:select score from users where id=2
-----B事务:让score发生变化,两次读取值不同了update users set score = 85 where id=2;commit;
A事务:select score from users where id=2 //读到了被commit的值85
A事务的执行过程被B事务影响了
幻读
就是读的结果的行数变多了。
set tx_isolation='repeatable-read';
select @@tx_isolation;
在P3级别下
A事务:select score from users where id=2
-----B事务:让score发生变化,两次读取值不同了update users set score = 85 where id=2;commit;
A事务:select score from users where id=2 //A完全不受B的影响读到的值为60
结论:符合事务原则,完全没毛病.
幻读发生
A事务:select * from users where score > 80 and score <=100
-----B事务:如果中间有新的年龄的人加入两次读取记录数不同了 update user set score = 85 where id=2;commit;
A事务:select * from users where score > 80 and score <=100,
结论:将只读到一条记录,但是A经过commit以后,会读到2条(第二条是B改了一条)感觉发生了幻觉。这就是幻读。