(十七)事务


事务

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


事务安全

事务(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">
posted @ 2018-10-16 16:27  Yiaz  阅读(101)  评论(0编辑  收藏  举报