mysql 数据库中一个事务具备ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。
而事务的隔离级别:
READ UNCOMMITTED(未提交读), READ COMMITTED(提交读), REPEATABLE READ(可重复读), SERIALIZABLE(可串行化)。f
这两者之间究竟该如何理解,化繁为简,一张表,三个字段梳理关系如下:
环境准备:
mysql 版本:10.3.8-MariaDB-1:10.3.8+maria~xenial-log
innodb模式
建表语句:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c` int(11) NOT NULL DEFAULT '0',
`d` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idxcd` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=1 ;
id 主键,其他复合索引。
延长锁等待时间:set innodb_lock_wait_timeout=120;
取消自动提交:set autocommit = 0;
一、并发操作数据库的异常表现
a、脏读
1. 修改mysql 数据库的隔离模式为 READ UNCOMMITTED
set global transaction isolation level READ UNCOMMITTED ;
set session transaction isolation level READ UNCOMMITTED ;
2. 开启三个事务,分别执行
T1: update test set c = 51 where d = 10;
T2: update test set c = 52 where d = 10;
T3:update test set c = 53 where d = 10;
T1 事务中commit;然后查询select * from test where d = 10;
结果c = 52 或者 c =53。
这就是脏读,读取了其他事务并未提交的事务。