MySQL 锁与事务控制
一、锁:
表锁:MyISAM、Memory 存储引擎;行锁:InnoDB 存储引擎;页锁:BDB 存储引擎;默认情况下表锁和行锁都是自动获得的,不需要额外的命令;但是有时候用户需要明确的进行行锁或者进行事务的控制,以便确保整个事务的完整性,这样就需要用到事务控制和锁定语句来完成。
1、lock / unlock 语法:
lock tables mytable read / write; #获取读或写锁
select * from mytable ;
unlock tables; #释放锁
2、read 锁也称共享锁,当使用read 锁定一张表(行)时,其他的会话仍然可使用read 锁(读操作),但不能使用write 锁(写操作),直到read 锁被释放;
3、write 锁也称排他锁,当使用write 锁定一张表(行)时,其他的会话的读写操作就被阻塞,直到write 锁释放;
二、数据库事务:
数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行。
1、ACID特性:
原子性 (Atomic):是指事务包含的所有操作要么全部成功,要么全部失败回滚;不存在一部分成功,一部分失败;
一致性(Consistency):是指事务必须使数据库从一个一致的状态变到一个一致的状态,也就是执行事务之前和之后的状态都必须处于一致的状态;
隔离性(Isolation):是指当多个用户并发操作数据库同一张表时,数据库此时会为每个用户开启一个新事务,事务之间是隔离的,各自操作互不影响;
持久性(Durability):是指当一个事务提交后,对于数据库中改变的数据是永久性的,即便是在数据库遭遇故障的情况下也不会丢失提交的事务操作;
2、使用事务:
MySQL 默认是自动提交事务,可以通过 set autocommit = 0/1 设置禁止/开启自动提交;
set autocommit = 0; #禁止自动提交事务
start transaction; #开启事务 select * from mytable ; commit; #提交事务 rollback; #回滚事务
3、事务隔离的重要性:
3.1、如果没有事务隔离,会发生几种问题:
脏读(Dirty Read):一个事务处理过程中读取了另一个未提交的事务中的数据;
不可重复读(NonRepeatable Read):对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询的隔离期间,另一个事务修改并提交了该数据;
幻读(Phantom Read):在一个事务中读取到了别的事务插入(删除)的数据,导致前后不一致;
3.2、不同隔离级别的问题:
3.3、MySQL 中的隔离级别的设置:
隔离级别:Serializable | Repeatable | Read committed | Read uncommitted
设置session 级别是指当前session 以后的所有事务
设置global 级别是指之后的所有session ,不包括当前session
默认设置级别是指当前session 的下一个事务
select @@tx_isolation; #查看当前事务的隔离级别 # 修改事务的隔离级别 set [global | session] transaction isolation level Read uncommitted; set tx_isolation='Read uncommitted';