什么是事务
一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
为什么需要事务
需求:jeff 给jack 转账1000元
假设转账分为两部完成
1. jeff减少1000 update test set money = money -500 where name= ‘jeff’
2. jack增加1000 update test set money = money +500 where name= ‘jack’
如果在完成了第1步的时候突然宕机了,jeff的钱减少了而jack的钱没有增加那jeff岂不是白白丢了1000元;这时候就需要用到我们的事务了
事务流程:
1. begin 开启事务(开启事务后会把所有的操作先存放到事务日志data目录下的ib_logfile0 ,ib_logfile01)
2. 进行实务操作
3. 关闭事务
a. COMMIT提交事务:同步数据保存到数据库表
b. ROLLBACK回滚事务:清空日志表
事务只有两个状态要嘛提交 要嘛回滚。所以提交后的事务无法回滚
- commit 事务提交
- rollback 事务回滚
- begin 开启事务
- start transaction 开启事务 同begin
- set transaction 设置事务隔离级别,只对当前会话有效
事务的特征(ACID)
A:原 子性(Atomicity,或称不可分割性)
原子性指的是事务的状态,要嘛执行成功,要嘛执行不成功回滚到以前的状态,
C:一致性(Consistency)
事务在开始之前和开始之后,数据是一一致的 ,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的,举个粒子,张三给李四转账100元。事务要做的是从张三账户上减掉100元,李四账户上加上100元。一致性的含义是其他事务要么看到张三还没有给李四转账的状态,要么张三已经成功转账给李四的状态,而对于张三少了100元,李四还没加上100元这个中间状态是不可见的。
I: 隔离性(Isolation,又称独立性)
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。数据库的隔离性分为读未提交(Read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
D:持久性(Durability)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。可以简单的认为事务执行完成后就相当于落盘了,即使数据库服务器宕机了,重启后,已经提交的事务所做的修改依旧有效。
事务的隔离级别
脏读:一个事务读取到别的事务中未提交的事务,叫做脏读。
不可重复读:一个事务在同一条记录中在事务的生命周期内,如果未对该条数据做修改,则多次读取的时候,应该与第一次读取的记录相同,(也就是这个事务读到了另外一个事务提交后的更改数据)
幻读:在查询过程中多出了数据记录或者少了数据记录,(这个事务读到了另外一个事务提交后的的插入或者删除数据)
隔离界别
① read uncommitted:什么问题也没解决
② read committed:解决脏读
③ repeatable read:解决重复读 inodb 默认隔离机制
④ serializable:解决幻读