事务概念:就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL语句都将被取消执行
MySQL数据库中仅InnoDB和BDB类型的数据库,表支持事务
-- 添加事务的操作
-- 关闭自动提交
set autocommit = 0;
-- 开启事务
START TRANSACTION;
-- 一组sql语句
update bank set bmoney=bmoney-100 where bname='小牛';
update bank set bmoney=bmoney+100 where bname='小铁';
-- 事务关闭(只能执行其一)
-- 提交
commit;
-- 回滚
rollback;
set autocommit = 1;
事务的四个特征(ACID)
- 原子性(Atomicity)一个事务中的所有操作要么全部完成,要么全部不完成,在执行过程中发生错误,会回滚到事务开始前的状态,不会发生部分成功部分失败的情况
- 一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
- 隔离性(Isolation)一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰
- 持久性(Durability)一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的
MySQL的四种隔离级别
1.Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果
2.Read Committed(读取提交内容 也叫做不可重复读)
大多数数据库默认的隔离级别(MySQL不是)一个事务只能读取其他已经提交事务的执行结果
3.Repeatable Read(可重读)
MySQL的默认隔离级别,它确保同一事物的多个实例在并发读取数据时,会看到同样的数据行
4.Serializable(可串行化)
最高的隔离级别,强制事务排序,使之不可能相互冲突从而解决幻读问题,可能导致大量超时现象和锁竞争
低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
隔离级别可能会产生的问题
脏读:某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的
不可重复读:在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读:在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |