MySQL 锁机制和事务(4)

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 |

 

一致读

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6c657295ebb4837b7471e8c9aab82ec3.html