Mysql事务
2021-08-12 00:04:43 小德 MySQL 访问次数 121

一、简介

    事务由存储引擎实现,innoDB支持事务, myIsam不支持事物。

    1、不要嵌套事务

    2、不要在事务中执行DDL

    3、当sql执行出错,应用应自行决定是否回滚,mysql不会自动处理。

    4、 autocommit 属性用于控制是否自动提交,默认情况下是“1”,表示每个更新语句都是单独的事务。可通过“SET AUTOCOMMIT”语句将该值设置为0,表示不自动提交。

    5、“START TRANSACTION”语句用于优雅的启动一个事务,它忽略autocommit属性,直到事务结束

    6、长事务转化批量的小事务

二、事务隔离级别 见 http://www.xiaodeworld.com/index.php/web/index/select_one?id=185

      事务特性的实现:

        隔离性由锁实现;原子性,持久性通过数据库的redolog ;一致性通过undo log 实现。

        redolog是重做日志,保证事务的原子性和持久性,undolog保证事务的一致性。

        Force Log at Commit 事务提交时必须先将所有日志(redolog & undolog)写入重做日志进行持久化,待事务commit完成才算完成。==>持久性 

        undolog保证事务持久性,帮助事务回滚及MVCC,redolog 顺序写的,undolog随机读写

        确保日志写入重做日志,每次写入后,需要fsync,fsync的效率取决于磁盘,因此磁盘的性能觉得事务提交的性能,也就是数据库的性能

     tips:

        1、“START TRANSACTION”或者“SET AUTOCOMMIT=0”只是指出将要开始事务,仅当开始续执行第一个 SQL 时才会真正启动事务,并分配版本号

  •  2、写操作对 MVCC 的作用是在事务提交时才发生的,其记录的版本号和删除号都是事务提交时的系统版本号;

  •  3、事务持续时间要尽量短,否则可能导致大量被删除行滞留在系统中

  •  4、事务总能看到自己的写操作。当事务更新了行后,该事务后续的读写都能够看到这些更改,显式锁用于解决先读后写的数据一致性问题

  •  5、一个事务中不应混用多种引擎的表,否则可能导致事务结果处于不一致状态

  •  6、应该总是使用“START TRANSACTION”启动事务,避免操作autocommit。

  •  7、不应在循环中提交事务

三、分布式事务XA

    1、分布式事务指允许多个事务资源参与到一个全局事务中,要求所有参与全局事务的事务要么都提交,要么都回滚。提高了ACID的要求。

    2、在InnoDB存储引擎中,分布式事务必须设置成SERIALIZABLE.

    3、分布式事务可以产生在不同的数据库之间

    4、分布式事务的组成:资源管理器,一个数据库就是一个资源管理器;事务管理器:协调参与全局事务的各个事务,需要和参与全局事务的所有资源进行通信;应用程序:定义事务的边界,指定全局事务中的操作

    5、分布式事务使用两段式提交:a.所有参与全局事务的节点准备,告诉事务管理器准备好提交了;

                                                b.事务管理器告诉资源管理器执行ROLLBACK还是COMMIT

    6、mysql数据库的命令演示分布式事务行不通,通常通过编程语言来完成分布式事务的操作。