zoukankan      html  css  js  c++  java
  • (十七)事务


    事务

    关于事务概念,请看 事务介绍


    事务安全

    事务(transaction):一系列将要发生的连续操作 ;

    事务安全:一种机制,使得事务的一系列操作,必须要么全部成功,要么全部失败 ;

    意义:保证数据操作的完整性 ;


    事务操作

    事务操作分为两种:自动事务(默认的)手动事务

    1. 手动事务

      开启事务以后,表明告诉系统,以下的所有操作(写),先都不要直接写入到数据库中,先存放在事务日志中,其中事务日志,在 mysql/data/ib_logfileX 文件里面 ;

      -- 开启事务
      start transaction ;
      
      -- 进行事务操作:一系列的sql操作
      -- 这时候,进行的一系列操作,其他人查表是看不到的
      -- 因为根本就没有进行写操作,都是先存在日志中,等着最后的提交事务 ;
      ...
      
      --关闭事务:提交事务/回滚事务
      commit ;/rollback ;
      
      

      关闭事务:要么操作成功,提交事务,此时将日志中的操作结果同步到表中,然后清空日志;要么操作失败,回滚事务,此时直接将日志全部清空;

    2. 自动事务

      mysql 中,默认是自动事务的,即自己提交事务 ,它通过系统变量控制;

      # 查看autocommit 变量值 1代表on,0代表off ;
      mysql> select @@autocommit ;
      +--------------+
      | @@autocommit |
      +--------------+
      |            1 |
      +--------------+
      1 row in set (0.01 sec)
      
      # 改变为0 ,这时候就需要commit了,否则数据是无法写到数据表的 ;
      mysql> set autocommit = 0 ;
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> select @@autocommit ;
      +--------------+
      | @@autocommit |
      +--------------+
      |            0 |
      +--------------+
      1 row in set (0.00 sec)
      
      

    事务原理

    事务开启之后,所有操作都会临时保存到事务日志中,事务日志只有得到 commit 命令才会同步到数据表中,其他任何清空都会清空(rollback 、断电、断开连接) ;

    我们平时普通的连接数据库的时候,默认是自动事务(自己提交),也会 开启一个临时事务表,里面保存此次连接,以及一些连接的信息,比如:字符集、自增长等 ;

    这种情况下,对数据表的操作是直接写到数据库中的 ;

    当我们开始事务以后,对数据表的所有操作,都会写到临时日志文件中,查询数据表的时候,先从数据库查,然后经过临时日志文件的处理,再返回;

    最后关闭事务,删除所有的日志文件 ,执行 commit 或者 rollback


    事务回滚点

    当操作失败,关闭事务时,进行 rollback 的时候,可能前面某些操作,我们已经操作成功了,但是回滚会直接回滚掉这些成功操作,但是我们不想重复做那些了,我们可以设置一个点,指定回滚的时候,回滚到该点即可;这个点,就是回滚点( rollback to) ;

    
    -- 设置回滚点
    savepoint 回滚点名字 ;
    
    -- 回滚到具体回滚点
    rollback to 回滚点名字 ;
    
    
    

    我们自己控制回滚一定要记得 提交事务,否则数据库发现没有提交,自己就又会进行回滚事务 。


    事务特性

    事务特性(点击查看)


    锁机制

    innodb 默认是行锁,但是如果事务操作中,没有使用索引,不能明确的知道数据在哪,那么系统就需要进行全表的检索,这时候,就自动的提升为表锁 ;

    行锁 :只有当前操作的行被锁住,其他用户不可以访问该行,但是其他行不影响 ;
    表锁 :整张表都不锁住,这张表目前只能供当前操作的用户使用了 ;

    当某一个连接开启事务的时候,然后执行某个操作,并且没有索引,导致表被锁,并且没有立即 commit ,这时候其他连接进来,操作(增删改)该表的时候,是需要等待的 ,如果长时间(大概 30s),事务还是没提交,表还是被锁,则提示操作失败;


    详细的事务介绍


    border="0" src="//music.163.com/outchain/player?type=2&id=1302154939&auto=1&height=66" width="0" height="1">
  • 相关阅读:
    【转】linux和windows下安装python集成开发环境及其python包
    python访问列表不连续的多个元素
    tidyverse学习与总结
    正则表达式去除html中的标签
    数据挖掘听课笔记
    linux系统管理学习笔记5-管理用户
    linux系统管理学习笔记2-管理文件
    linux系统管理学习笔记3-重定向和管道
    linux系统管理学习笔记4-使用vi
    linux系统管理学习笔记8-管理软件包
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665631.html
Copyright © 2011-2022 走看看