一:事务的四大属性 : ACID
原子性 atomicity : 事务是一个原子操作单元.当事务修改时,要么全执行,要么全不执行,不允许事务部分完成.
一致性 consistency : 一个事务执行开始和执行完成,数据库数据必须保持一致性状态.这意味着所有相关数据都必须应用于事务的修改,以保证完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的.
数据不一致性的表现:脏读,幻读,不可重复读;
隔离性(独立性) isolation : 隔离性使得每个事务的更新在它被提交之前,对其他事务不可见,提高安全性.实现隔离性是解决临时更新与消除级联回滚(级联回滚即因一个事务故障导致一系列事务回滚)问题的一种方式.
持久性(永久性) durability :事务完成后,数据库中数据的修改是永久性的的,当系统或介质发生故障,该修改也是永久性的.持久性一般通过数据库备份与恢复来保证
二:并发事务带来的问题:
更新丢失 Lost Update
脏读 Dirty Reads : “select”操作不规矩
不可重复读 Non-Repeatable Reads : “update”操作不规矩
幻读 Phantom Reads : “insert”和“delete”操作不规矩
三:事务的隔离级别
未提交读 Read uncommittned : 无法避免脏读,不可重复读,幻读,属于最低级别,只能保证不读取物理上的损坏的数据
已提交读 Read committed : 可以避免脏读,属于语句级
可重复读 Repeatable : 可以避免脏读,不可重复读,属于事务级
序列化 Repeatable : 可以避免脏读,不可重复读,幻读,属于事务级,最高级别
为了防止出现脏读、不可重复读、幻读等情况,我们就需要根据我们的实际需求来设置事务隔离机制来解决。 数据库的事务隔离越严格,并发的副作用越小,但付出的代价也越大.因为事务隔离实质上就是在一定程度上"串行化"进行,这与"并发"相矛盾.
四:扩展:
- 锁的分类:从对数据的操作类型分为读锁和写锁。从对数据操作的粒度来分:表锁和行锁
- 查看当前数据库的事务隔离级别 : show variables like ‘tx_isolation’;
- 在mysql数据库中如何锁定一行数据,保证不被其他的操作影响 : 在SQL语句后面加上for update,可以锁定某一行,其他操作会被阻塞,直到锁定行的会话被commit