(提交读)html
了解了以前 READ UNCOMMITTED
隔离级别是如何加锁的, 而且在文章中, 已经知道 READ COMMITTED
隔离级别能够解决脏读的问题, 那接下来, 对于 READ COMMITTED
隔离级别, 试想一下若是让你用锁来设计, 你会怎么作?mysql
READ COMMITTED
隔离级别能够解决脏读
的问题, 也就是他可让事务只能读其余事务已提交的的记录。READ COMMITTED
隔离级别的效果, 也就避免了脏读
, 但问题是这是一种很低效的作法, 由于对于大部分应用来讲, 读操做是多于写操做的, 当写操做加锁时, 那么读操做所有被阻塞, 这样在大用户量高并发的状况下, 会直接下降数据库的读效率。数据表结构以下:sql
mysql> select * from test_transaction; +----+---------------+-----+--------+--------------------+ | id | user_name | age | gender | desctiption | +----+---------------+-----+--------+--------------------+ | 1 | 金刚狼 | 127 | 2 | 我有一双铁爪 | | 2 | 钢铁侠-rym | 120 | 1 | 我有一身铁甲 | | 3 | 绿巨人 | 0 | 2 | 我有一身肉 | +----+---------------+-----+--------+--------------------+ 3 rows in set (0.00 sec) mysql>
从新设置客户端1
事务隔离级别为read committed: SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
数据库
mysql> SELECT @@SESSION.tx_isolation; +------------------------+ | @@SESSION.tx_isolation | +------------------------+ | REPEATABLE-READ | +------------------------+ 1 row in set (0.00 sec) mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@SESSION.tx_isolation; +------------------------+ | @@SESSION.tx_isolation | +------------------------+ | READ-COMMITTED | +------------------------+ 1 row in set (0.00 sec) mysql>
客户端2
并设置事务隔离级别为read committed;客户端1
中打开事务, 而后更改数据, 先不提交; 而后在客户端2
中打开事务, 读取客户端1
中还没有提交的那条被修改数据客户端2
中能够正常读取到那条数据, 只不过, 那条数据并非被客户端1
事务中修改后的数据, 而是最初的稳定数据
, 这就避免了脏读
!!对于该隔离级别修改数据时使用的锁类型, 其分析方法, 和以前一篇MySQL(INNODB引擎)事务READ UNCOMMITTED隔离级别和锁的关系 是同样的:segmentfault
客户端1
的事务在修改数据而且未提交时, 在客户端2
中对同一数据进行修改, 而后在客户端2
阻塞阶段经过查看表的加锁状况: select * from information_schema.INNODB_LOCKS;
, 事务状态: select * from information_schema.INNODB_TRX;
,客户端2
的修改语句会锁等待~