SERIALIZABLE:串行化,此隔离级别更接近于可重复读这个级别,只是当autocommit功能被禁用后, InnoDB引擎会将每个select语句隐含的转化为select … lock in share mode
总结:
在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。我们的数据库锁,也是为了构建这些隔离级别存在的。
可重复读 不可能 不可能 可能
提交读 不可能 可能 可能
未提交读 可能 可能 可能
串行化 不可能 不可能 不可能
未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别
可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
Autocommit/commit/rollback当设置autocommit属性开启时,每个SQL语句都会隐含成为独立的事务。
默认情况下autocommit属性是开启的,也就意味着当每个SQL语句最后执行结果不返回错误时都会执行commit语句,当返回失败时会执行rollback语句
而当autocommit属性开启时,可以通过执行start transaction或者begin语句来显示的开启一个事务,而事务里可以包含多个SQL语句,最终事务的结束是由commit或者rollback来终结
而当在数据库链接里执行set autocommit=0代表当前数据库链接禁止自动提交,事务的终结由commit或者rollback决定,同时也意味着下一个事务的开始
如果一个事务在autocommit=0的情况下数据库链接退出而没有执行commit语句,则这个事务会回滚
一些特定的语句会隐含的终结事务,就好比是执行了commit语句
commit语句代表将此事务的数据修改永久化,并对其他事务可见,而rollback则代表将此事务的数据修改回滚
commit和rollback都会把当前事务执行所施加的锁释放
当使用多语句事务时,如果全局的autocommit属性是开启的,则开始此事务的方式可以使set autocommit=0将当前链接的属性关闭,最后执行commit和rollback;或者是显示的使用start transaction语句开启事务
+ View Code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
• mysql> -- Do a transaction with autocommit turned on.
• mysql> create table customer (id int,name varchar(48));
• mysql> START TRANSACTION;
• mysql> INSERT INTO customer VALUES (10, 'Heikki');
• Query OK, 1 row affected (0.00 sec)
• mysql> COMMIT;
• Query OK, 0 rows affected (0.00 sec)
• mysql> -- Do another transaction with autocommit turned off.
• mysql> SET autocommit=0;
• mysql> INSERT INTO customer VALUES (15, 'John');
• Query OK, 1 row affected (0.00 sec)
• mysql> INSERT INTO customer VALUES (20, 'Paul');
• Query OK, 1 row affected (0.00 sec)
• mysql> DELETE FROM customer WHERE b = 'Heikki';
• Query OK, 1 row affected (0.00 sec)
• mysql> -- Now we undo those last 2 inserts and the delete.
• mysql> ROLLBACK;
• Query OK, 0 rows affected (0.00 sec)
• mysql> SELECT * FROM customer;
• +------+--------+
• | a | b |
• +------+--------+
• | 10 | Heikki |
一致读