事务

1.事务:

        若干个操作指令的集合(DML,即若干个DML语句组成就是事务)

        事物特点:集合中的操作要么一起成功,要么一起失败

        所以才有commit/rollback ,即所有都成功了则提交,否则回滚


   2.事务开启的标志:

        set autocommit=0;

        DML语句开始

   3.事务结束的标志:

    提交结束:

        1.显示提交 commit

        2.隐式提交

        执行DDL语句后会自动提交

        正常退出:quit命令等 会自动提交

    回滚结束:

        1.显示回滚 rollback

        2.隐式回滚 异常退出,掉电,宕机等情况会自动回滚


    4.事务的4大特性(ACID):原子性,一致性,隔离性,持久性

        原子性 (Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。(转账)

        一致性 (Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致(转账前后双方总余额和之前一致)。

        隔离性 (Isolation):事务的执行不受其他事务的干扰,当数据库被多个客户端并发访问时,隔离它们的操 作,防止出现:脏读、幻读、不可重复读。

        持久性 (Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,数据永久性改变;(删除后不可恢复)


    5.隔离级别

        1).对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:

                (1).脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.

                (2).不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.

                (3).幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

        2). 数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.

        3). 一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱


    SQL99定义4中隔离级别:

        (1).Read Uncommitted 读未提交数据。

        (2).Read Commited 读已提交数据。 (Oracle默认)

        (3).Repeatable Read 可重复读。 (MySQL默认)

        (4).Serializable 序列化、串行化。 (查询也要等前一个事务结束)

这4种MySQL都支持

  (1)Oracle支持的隔离级别: Read Commited(默认)和 Serializable,以及Oracle自定义的Read Only三种。

    (2).Read Commited读已经提交,意思是如果没有提交,其他人是读不到的。

        级别越高越好,最高级别也就是(4).Serializable,三种不希望出现的读 都不会出现,但是这种没人用,因为是串行的,效率太低

        Read Only:由于大多数情况下,在事务操作的过程中,不希望别人也来操作,但是如果将别人的隔离级别设置为Serializable(串行),但是单线程会导致数据库的性能太差。是应该允许别人来进行read操作的。


    6.事务也是关系型数据库的特点,也就是关系型数据库一般都支持事务,非关系型的则不支持


    7.控制事务

        除了commit rollback外还有savepoint(保存点)

        保存点,类似还原点,即可以使用回滚的方式恢复到那一时刻(保存的时刻)。如果都不是自己

        要回滚的保存点,那就可以用rollback回到最初,也就是直接回滚到上一次commit的时候。

        如果没有回滚,觉得事务结束了,则直接提交即可,代表当前的事务结束了。

    使用示例:

        savepoint aaa;

        rollback to savepoint aaa;//回滚到保存点aaa

    注意,

        如果保存点设置名称重复,则会删除之前的那个保存点。

        一但commit之后,savepoint将失效。

        回退到某个保存点后,则不能在回退到该保存点之后的保存点了。也就是说,不会回退到比当前保存点更新的保存点。

你可能感兴趣的:(事务)