A:原子性(Atomic),一个事务作为一个最小执行单元,里面的sql要么全部执行要么全部失败或者回滚
C:一致性(Consistency),在一致性状态下,所有事务对一个数据的读取结果都是相同的,例:张三给李四转账100元,其他事务要么看到张三还没给李四转账的状态,要么张三已经给李四转账成功张三少100李四多100,而在张三少100李四的100没有加上的中间状态是不可见的
I:隔离性(Isolation)重点,多个事务并发执行时,一个事务执行不应该影响其他事务的执行
D:持久性(Durability),一个事务的提交应该永久的保存在数据库中,当系统发生故障时需要确保已提交的更新不能发生丢失
事务隔离级别:
-
查询当前数据库事务隔离级别
-
事务并发的问题
-
脏读:
- 事务b读到了事务a中已经修改但未提交的结果,这违背了一致性的条件,中间如果事务a有多步骤或者事务a回滚了,事情就大条了
- 隔离级别read uncommitted 会出现
- 隔离级别read committed 及以下可以避免
-
不可重复读
- 在事务b中几次读取了同一条数据的内容,事务a在事务b一次事务的时间提交了多次对该数据的修改,造成事务b读取到了结果不一致的内容
- 隔离级别read committed 及以上会出现
- 隔离级别 repeatable read 及以下可以避免
-
幻读
- 在事务b修改数据前查询要修改的数据为3条,但是另一个事务a新增或者删除了3条中范围内的数据,在事务b执行修改sql后返回修改的数据结果不是3条数据,造成修改多了或者少修改了,感觉就像发生了幻觉…
- 隔离级别 repeatable read 及以上会出现
- 隔离级别 serializable 可以避免
-
-
隔离等级:
-
1.read uncommitted:
- 可以读取另一个事务中已修改但未提交的数据
-
2.read committed
- 解决脏读的问题
- 相比第一条只能读取到另一个事务中已提交的数据
- 可以避免脏读出现
-
3.repeatable read
- 解决可重复读及以上问题
- 相比以上,可以保证在当前事务中多次读取到的相同行数据结果集相同
- 可以解决不可重复读的问题
-
4.serializable
- 解决幻读及以上的问题
- 串行事务,执行效率过低
-
事务的显式操作:
-
查询当前事务隔离级别
- select @@tx_isolation;
-
开启一个事务
- start transaction;
-
提交一个事务
- commit;
-
回滚一个事务
- rollback;
-
设置事务的隔离级别
- set sesstion transaction isolation level {隔离等级}