撒子是事务?
事务的意思是一条或者是一组语句组成一个单元,这个单元要么全部执行,要么全不执行。
比如我们转账,A要给B转300块钱,我们需要用两条sql语句,A账户的钱减去500,B账户中的钱增加500,但是计算机可能由于某些原因上面语句执行了下面的没有执行,所以为了保证两条语句要么都执行,要么都不执行,这时候就用到了事务。
事务的四个原则(ACID)
原子性(Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都成功,要么都失败
一致性(Consistency)
事务前后的数据完整性要保持一致
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,事物之间要相互隔离。
持久性(Durability)
事务一旦提交则不可逆,被持久化到数据库中
事务实现
--模拟转账
set autocommit = 0; --关闭自动提交
start transaction; --开启一组事务
update account set money=money-500 where name='A'; --A的钱-500
update account set money=money+500 where name='B'; --B的钱+500
commit; --提交事务,就会被持久化
rollback; --回滚,提交失败就回滚
set autocommit = 1; --回复默认值
隔离所导致的一些问题
脏读:
一个事务读取了另外一个事务未提交的数据
不可重复读:
原本有单修改了的数据
幻读:
别的事务插入的新数据,导致前后读取不一致
隔离级别
1.未提交读(read-uncommitted)
在一个事务中,可以读取到其他事务未提交的数据变化,这种读取其他会话还没提交的事务,叫做脏读现象,在生产环境中切勿使用。
2.已提交读(read-committed)
在一个事务中,可以读取到其他事务已经提交的数据变化,这种读取也就叫做不可重复读,因为两次同样的查询可能会得到不一样的结果。
3.可重复读(repetable-read)
MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题。
4.可串行化(serializable)
这是最高的隔离级别,它强制事务串行执行,避免了前面说的幻读现象,简单来说,它会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁争用问题。
隔离级别 | 读数据一致性 | 脏读 | 不可重复读 | 幻读 |
未提交读 | 最低级别,只保证不读取物理上损坏的数据 | 有 | 有 | 有 |
已提交读 | 语句级 | 无 | 有 | 有 |
可重复读 | 事务级 | 无 | 无 | 有 |
可串行化 | 最高级别,事务级 | 无 | 无 | 无 |