什么是事务?
- 在mysql中只有使用了innodb,才能使用事务。
- 事务是用来管理 inster update delete等操作的,保证成批的sql语句,要么全部执行,要么全部不执行。主要是保证数据的完整性的操作。
事务的特性
- A 原子性
一个事务中所有的操作,要么全部成功,要不全部不成功,不会结束在中间某一个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务发生前的状态 - C 一致性
事务发生前和发生后,数据的完整性没有被破坏。 - I 隔离性
数据库允许多个事务同时进行数据库进行读写和修改的能力,隔离性可以保证多个事务并发操作互不影响。所以隔离级别,读未提交,读已提交,可重复读,串行化 - D 持久性
事务处理结束后,对数据的处理就是永久的。
事务的隔离级别
怎么查询当期事务隔离级别
show VARIABLES like “TRANSACTION%”;
设置隔离级别 set transacation level xxx (隔离级别)
设置当期会话的隔离级别 : set sesscion transacation level xxx
设置全局的隔离级别 set global transacation level xxx (隔离级别
- 读未提交 (Read uncommitted)
ru级别 可能会读到其他事务未提交的数据 脏读 隔离级别最低的,很少使用 - 读已提交(read committed)
rc 级别 读的数据是提交的状态 可能会发生不可重复读,两次读取的数据不一致。
防止脏读(因为是读取的是已经提交的数据) - 可重复读(repeatable read)
rr 级别 默认的隔离级别,每次的读取的数据结果都是一样的,可能会发生幻读
防止脏读和不能重复读 - 串行化 (Serializable)
最严格的事务类型 防止 脏读 幻读 不可重复读
出现的问题,解决方案
主要是不可重复读 和幻读
不可重复读 :
是指的同样的条件,前后读取的数据不一样;主要是因为交叉事务修改了数据
解决:使用可重复读的隔离级别
幻读:
- 事务在插入已经检查过不存在的记录时,惊奇的发现这些数据已经存在了,之前的检测获取到的数据如同鬼影一般
- 同样的条件,第一次读取记录数和第二次读取的记录数不一样,因为是中途有插入数据
解决:
使用串行化隔离级