一、事务四大特性:
1.原子性:在一个事务中的多次增删改,只要存在一次失败,则全部失败;成功即全部成功。
2.一致性:与原子性相关联,数据库修改前后,数据要保持一致;如A和B各有500元,A向B转账100,事务结束后应保证两者总和为1000保持和转账之前一致;
3.隔离性:事务之间不应该相互影响,涉及事务的隔离级别,事务A中的操作不应该影响事务B的结果;
4.永久性:数据库执行commit之后,数据应该再磁盘中永久存在(在磁盘没损坏前提下),即使数据库系统宕机无法使用,也应该保证数据的永久化;
二、事务的隔离级别:
在此之前需要先知道隔离级别是为了做什么而存在的,事务的隔离级别是为了解决数据库的三个问题,分别是:
1.脏读:事务A查询时查到了事务B还未提交的内容;如事务B将张三的分数由77改为88,但是还没有提交,此时事务A查询张三的分数,结果是88;
2.不可重复读:事务A执行两次查询,第一次查询张三分数为77,此时事务B更改张三分数为88并提交,事务A在第二次查询时结果为88,两次查询结果不一致;
3.幻读:事务A想修改表中所有数据时,事务B在表中新增了一条数据,导致事务A修改后还有一条没有修改的数据;如今天老板开心说给所有员工的饭卡里每人充100,在事务A执行修改过程中,此时刚好有个新同事入职,部门表就会多一条数据,事务A执行完发现新同事的饭卡并没有多100;
了解了这三个问题,现在说一下事务的四个隔离级别:
1.读未提交(Read uncommitted):最低的隔离级别,事务A可以读取到事务B未提交的数据,未提交的都可以读到那么一定会存在不可重复读和幻读;
2.读已提交(Read committed):事务A只能读取已提交的数据,存在不可重复读和幻读;
3.可重复读(Repeatable read):事务A中无论多少次查询,查询某一条数据的信息都是一致的,但是存在幻读;
4.串行化(Serializable):将所有事务进行排队执行,一个一个来,效率低。
在使用事务时可以自定义隔离级别,也可以使用数据库默认的隔离级别,Oracle默认隔离级别是读已提交(Read committed),MySQL默认隔离级别是可重复读(Repeatable read);