什么事事务?
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行结果将使数据库从一种一致性状态变迁到另一种一致性状态。 事务是逻辑上的一组操作,要么全部执行成功,要么全部不执行成功1. 原子性
事务的最小执行的执行的单位,不允许分割。事务的原子性确保动作要么全部成功,要么全部不成功
例如: 银行转账, A 账户 有 1000 元, B 账户也有1000元,,A 转 100 给 B账户,要么 A账户剩余900,B 账户 为1100元,要么就都为1000元,不会出现其他的情况,要就全部成功,要么全部失败
2. 一致性
执行事务前后,数据保持一致性,多个事务对同一数据读取的结果是相同的
例如: 银行转账, A 账户 有 1000 元, B 账户也有1000元,A 转 100 给 B账户,中途不管怎么操作,A和 B 账户的总和都是 2000
3. 隔离性
并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
4.持久性
一个事务被提交之后。他对数据库的改变是持久的,即使是数据库发生故障也不应该 对其收到影响
数据库 的隔离级别
1. 读未提交(Read Uncommitted)
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读,幻读,不可重复读
2. 读以提交(Read Committed)
允许读取并发事务以提交的数据,可以阻止脏读,但是幻读或不可重复读任有可能发送
3. 可重复读(Repeatable Read)
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复度,但是任然有可能发送幻读
4 可串行化(Serializable)
最高的隔离级别,完全服从ACID 的隔离级别,所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读,不可重复读,以及幻读
注
上面所列的隔离级别是从低到高,级别越高消耗的性能越大
以上是 MySQL 中 的隔离级别,而Oracle 数据库中 只有 读以提交和 可串行化 2种隔离级别
mysql中 默认的隔离级别是 读以提交(Read Committed)
脏读(Drity Read)
某个事务更新一份数据,另一个事务此时读取了同一份事务,由于默写原因,前一个事务回滚了,后面一个事务所读取的数据就会是不正确的
例如: 2个用户从同一个账户取钱(这个账户中有1000块),第一个用户取钱的时候(查询到余额是1000块),并且开启了一个事务,然后执行一系列操作将数据库里面的金额扣减了500块,然后第二个人也来取钱,但是他读取到的是 这个账户只有 500 块钱了(读取到第一个事务没有提交的数据),然后第一个用户因为一系列操作出现了问题,然后RollBac了,然后就导致第二个用户读取的数据不正确
不可重复读(Non repeatable read)
在一个事务中 2次查询之中数据不一样,可能是2次查询过程中间插入了一个事务更新的原有数据。
例如:2个用户操作同一个账户(账户中有1000块),2个用户同时去取钱,并且同时去查询用户有多少钱,并且同时查到的都是1000块,然后第一个用户去取钱开启了事务,第二个用户也去取钱,也开始了事务,但是在第二个用户提交事务之前,第一个事务就已经提交了事务,将账户中的钱就更改了,然后就出现了不可重复读
幻读
事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读