事务
!!!确保多个关联操作全部执行 需要用到事务
事务是mysql的一项功能 使一组数据操作(DML操作) 要么全部执行 要么全部不执行(原子操作)
不会因为某种异常情况(停电,网络中断,硬件故障等)出现只执行一部分操作的情况
事务的语法结构
start transaction 或者 begin(开始事务)
一组DML语句(一系列相关操作)
commit (提交事务)
rollback (事务回滚)
commit 提交事务 让数据更改永久有效
rollback 回滚当前的事务操作 取消对数据的更改
事务的4个主要特征!!!
原子性 事务的操作要么全部执行 要么全部不执行 不能从中间打断
一致性 数据的完整性不会因为事务的执行受到破坏
持久性 事务对数据的修改永久有效 不会因为系统故障失效
隔离性 多个事务同时执行时,不会相互干扰,不同的隔离级别,相互独立的程度不同
注:事务不会帮助处理sql语句执行中的错误
确保原子性与一致性
如果发现事务中的某个操作发生错误 要及时使用回滚 ;只有事务中的所有操作都可以正常执行,才进行提交;
关键就是 判断操作是否发生错误 通过row_count()的返回值,判断一个DML操作是否失败 -1表示操作失败
存储过程
另外一个常用到事务的地方就是存储过程
存储过程包含许多相互关联的数据操作 所以会大量使用事务
可以在mysql存储过程中,通过获取sql错误,决定事务是提交还是回滚
注:把重要的关联操作放在事务中,确保操作的原子性 并对失败的操作进行回滚处理
mysql中并不是所有的操作都可以回滚 比如: 创建数据库 创建数据表 删除数据库 删除数据表等,这些操作不能回滚 先做备份
确保隔离性
使用锁,实现事务之间的相互隔离 锁的使用方式不同,隔离的程度也不同
mysql支持4种事务隔离级别 等级越高,消耗资源越多
read uncommitted 可以读取事务中还未提交的被更改的数据
read committed 只能读取事务中已经提交的被更改的数据
repeatable read 表示一个事务中 对一个数据读取的值,永远跟第一次读取的值一致 不受其他事务中数据操作的影响 mysql默认选项
serializable 表示任何一个事务,一旦对某一个数据进行了操作 那么一直到这个事务结束,mysql都会把这个数据锁住 禁止其他事务对这个数据进行任何操作
事务的隔离性对并发操作非常有用 当许多用户同时操作数据库时,隔离性可以确保各个连接之间不相互影响
对于核心数据的更改操作设置较高的隔离等级