美文网首页
MySQL之:事务

MySQL之:事务

作者: Simon_Ye | 来源:发表于2020-03-30 16:54 被阅读0次

并发控制

锁粒度:

  • 表级锁
  • 行级锁

锁:

  • 读锁:共享锁,只读不可写,多个读互相不阻塞
  • 写锁:独占锁,排它锁,一个写锁会阻塞其它读和写锁

实现:

  • 存储引擎:自行实现其锁策略和锁粒度
  • 服务器级:实现了锁,表级锁;用户可显式请求

分类:

  • 隐式锁:由存储引擎自动施加锁
  • 显式锁:用户手动请求

锁策略:

在锁粒度及数据安全性寻求的平衡机制

显示使用锁:

  • 加锁
    LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [,tbl_name [[AS] alias] lock_type] ...
    
    lock_type:READ,WRITE
  • 解锁
    UNLOCK TABLES
  • 关闭正在打开的表(清除查询缓存),通常在备份前加全局读锁
    FLUSH TABLES tb_name[,...] [WITH READ LOCK]
  • 查询时加写或读锁
    SELECT clause [FOR UPDATE | LOCK IN SHARE MODE]

死锁:

两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态


事务

事务Transactions:

一组原子性的SQL语句,或一个独立工作单元

事务日志:

记录事务信息,实现undo,redo等故障恢复功能

  • 事务日志的写入类型为“追加”,因此其操作为“顺序I/O”;通常也被称为:预写式日志 write ahead logging
  • 日志文件:ib_logfile0,ib_logfile1

ACID特性:

  • A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚
  • C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态
  • I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发
  • D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中

启动事务:

START TRANSACTION

结束事务:

  1. COMMIT:提交
  2. ROLLBACK:回滚

注意:只有事务型存储引擎方能支持此类操作
建议:显式请求和提交事务,而不要使用“自动提交”功能
set autocommit={1|0}

事务支持保存点:savepoint

SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier

事务隔离级别:从上至下更加严格

  • READ UNCOMMITTED:可读取到未提交数据,产生脏读
  • READ COMMITTED:可读提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致
  • REPEATABLE READ:可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改前的旧数据,此为MySQL默认设置
  • SERIALIZABILE:可串行化,未提交的读事务阻塞修改事务,或者未提交的修改事务阻塞读事务。导致并发性能差
事务隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

MVCC:多版本并发控制,和事务级别相关

指定事务隔离级别:

  • 服务器变量tx_isolation指定,默认为REPEATABLE-READ,可在GLOBAL和SESSION级进行设置
    SET tx_isolation=''
          READ-UNCOMMITTED
          READ-COMMITTED
          REPEATABLE-READ
          SERIALIZABLE
    
  • 服务器选项中指定
    vim /etc/my.cnf
    [mysqld]
    transaction-isolation=SERIALIZABLE
    

相关文章

网友评论

      本文标题:MySQL之:事务

      本文链接:https://www.haomeiwen.com/subject/gzjvuhtx.html