事务
不可分割的操作,假设该操作有abcd四个步骤组成,若abcd四个步骤都成功完成,则认为事务完成,若abcd任意一个操作步骤失败,则认为事务失败,每条sql语句都是一个事务,事务只对dml语句有效,对于dql无效
事务的ACID
原子性Atomicity:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
一致性Consistency:一致性是指事务必须从数据库的一个性质状态变换到另一个性质状态,也就是说,一个事务执行之前和执行之后都必须出于一致性状态,让事务保持一定的合理
隔离性Isolation:多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
持久性Durability:这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)
事务的使用
开启事务 start transaction:
回滚事务rollback;遇到突发的情况,撤销执行的sql语句
提交事务:commit
事务的并发问题
查看事务的隔离级别:select @@global.tx_isolation,@@tx_isolation;
脏读:值一个线程中的事务读取到了另外一个线程中未提交的数据.
不可重复读(虚读)指一个线程中的事务读到了另一个线程中提交的update的数据
幻读一个线程中的事务读取到了另外一个线程中提交的insert事务
事务的隔离级别
未提交读,Read uncommitted :就是一个事务可以读取另一个未提交事务的数据(会引发脏读)
提交读,Read committe :一个事务要等另一个事务提交之后才能读到数据
重复读,Repeatable read (默认):开启事务的时候不允许其他人做修改操作
串行读,Serializable:开启事务的时候不允许其他人做查询和修改修改操作(表锁)
总结
未提交读:别人改数据的事务尚未提交,我在我的事务中也能读到。
提交读:别人改数据的事务已经提交,我在我的事务中才能读到。
重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
串行读:我的事务尚未提交,别人就别想改数据。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读,Read uncommitted | 是 | 是 | 是 |
提交读,Read committe | 否 | 是 | 是 |
重复读,Repeatable read (默认) | 否 | 否 | 是 |
串行读,Serializable | 否 | 否 | 否 |