数据库的事务

事务的四个重要特性
    原子性(要么全部成功,要么全部失败回滚)
    一致性(多种状态转换后结果不变)
    隔离性(多个事务并发之间不受互相影响)
    持久性(事务一旦提交,数据库的数据就是永久的)
    
事务的隔离性
    为了解决事务并发时的安全问题。
    
事务并发存在的问题
    脏读:事务A读取了事务B未提交的数据。
        隔离级别设置成Read Committed可避免,但是仍会造成不可重复读的问题。
        Sql Server , Oracle默认是Read Committed。
    不可重复读:数据库的某条数据,在一个事务范围内,多次查询返回的结果不同,这是因为查询间隔内改数据被别的事务修改了。
        隔离级别设置成Repeatable read可避免。
        MySql默认就是Repeatable read。
    幻读:一个事务在读时,另一个事务插入或者删除了新的记录,影响了读的结果。
        Serializable最高事务隔离级别,可避免脏读、不可重复读、幻读,但是性能低,因为该级别下事务串行执行。
    
    区别:
        脏读是读取了另一个事务未提交的数据,不可重复读是读取了上一个事务提交的数据。
        幻读和不可重复读都是读取了另一条已经提交的事务(区别于脏读的未提交),
        不同的是,不可重复读查询的都是同一条数据,关注点是更新操作,而幻读关注的是插入或删除的问题。


数据库的隔离级别
    MySQL支持四种,默认Repeatable read。
    Oracle只支持Serializable 和Read committed,默认是Read committed。
    -------------------------------------------------------------------------------------------------------------------
数据库的事务
    --------------------------------------------------------------------------------------------------------------------
    
    查看当前事务的隔离级别:    
        select @@tx_isolation;
    修改当前事务的隔离级别:
        SET tx_isolation='REPEATABLE-READ';

数据库并发控制
    乐观锁:假设事务不会冲突,不锁住任何东西,只是提交时检查是否发生冲突,如果冲突就回滚。
        实现方式一般是记录数据版本
    悲观锁:假设事务会冲突,将数据处于锁定状态,别的事务不可操作。
        实现方式是依靠数据库的锁机制。