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';

      

    

猜你喜欢

转载自www.cnblogs.com/haiyangwu/p/10466455.html