事务

事务

  • 事务Transactions:一组原子性的SQL语句,或一个独立工作单元
  • 事务日志:记录事务信息,实现undo,redo等故障恢复功能
  • ACID特性
    • A:atomicity原子性整个事务中的所有操作要么全部成功执行,要么全部失败后回滚(成功,失败)
    • C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态(数据一致,校验)
    • I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发(执行中的过程,是否可见)
    • D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中

Transaction生命周期

notion image
  • 启动事务: BEGIN BEGIN WORK START TRANSACTION
  • 结束事务: COMMIT:提交 ROLLBACK: 回滚 注意:只有事务型存储引擎中的DML语句方能支持此类操作
  • 自动提交:set autocommit={1|0} 默认为1,为0时设为非自动提交 建议:显式请求和提交事务,而不要使用“自动提交”功能
  • 事务支持保存点:savepoint
示例
事务比单条命令执行的速度还要快
可以对事务部分回滚的效果

事务隔离级别

  • 事务隔离级别:从上至下更加严格
    • READ UNCOMMITTED 可读取到未提交数据,产生脏读
    • READ COMMITTED 可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致
    • REPEATABLE READ 可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改前的旧数据。此为MySQL默认设置(系统默认的)
    • SERIALIZABILE 可串行化,未提交的读事务阻塞修改事务,或者未提交的修改事务阻塞读事务。导致并发性能差
  • MVCC: 多版本并发控制,和事务级别相关
事务隔离级别
脏读可能性
不可重复读可能性
幻读可能性
加锁读
指定事务隔离级别
  • 服务器变量tx\_isolation指定,默认为REPEATABLE-READ,可在GLOBAL和SESSION级进行设置
  • 服务器选项中指定

并发控制

  • 锁粒度: 表级锁 行级锁
  • 锁: 读锁:共享锁,只读不可写(包括当前事务) ,多个读互不阻塞 写锁:独占锁,排它锁,写锁会阻塞其它事务(不包括当前事务)的读和它锁
  • 实现 存储引擎:自行实现其锁策略和锁粒度 服务器级:实现了锁,表级锁,用户可显式请求
  • 分类: 隐式锁:由存储引擎自动施加锁 显式锁:用户手动请求
  • 锁策略:在锁粒度及数据安全性寻求的平衡机制
  • 显式使用锁
示例
  • 死锁: 两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态(比如两个事务同时执行,A B 更改表都会锁,mysql若发现这种情况,会把某个事务回滚,代价较轻的)
  • 事务日志: 事务日志的写入类型为“追加”,因此其操作为“顺序IO”;通常也被称为:预写式日志 write ahead logging 事务日志文件: ib\_logfile0, ib\_logfile1

小结

注意死锁的含义 两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态
T掉当前mariadb在连接 kill id 注意,可以根据时间和状态来T掉ID,当状态是增删改时,要注意下
写在事务里面的语句执行的会快很多,简单理解将所有的语句整合起来,执行完之后,只需要提交一次即可

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 438803792@qq.com
Loading...