事务
事务的特性
ACID
(atom)原子性:事务里面的操作单元不可切割,要么全部成功,要么全部失败
(consistency)一致性:事务执行前后,业务状态和其他业务状态保持一致.
(insulation)隔离性:一个事务执行的时候最好不要受到其他事务的影响
(duration)持久性:一旦事务提交或者回滚.这个状态都要持久化到数据库中
不考虑隔离性会出现的读问题
脏读:在一个事务中读取到另一个事务没有提交的数据
不可重复读:在一个事务中,两次查询的结果不一致(针对的update操作)
虚读(幻读):在一个事务中,两次查询的结果不一致(针对的insert操作)
事务的隔离级别
read uncommitted 读未提交 上面的三个问题都会出现
read committed 读已提交 可以避免脏读的发生
repeatable read 可重复读 可以避免脏读和不可重复读的发生
serializable 串行化 可以避免所有的问题(但是并不是绝对的)
通过mysql演示设置隔离级别
上述通过select @@tx_isolation来查看数据库的隔离级别
脏读演示:
先sart transaction手动开启一个事务
这里可以很清楚的看出左边的事务还未提交,而右边的事务就已经可以读取到了
当把隔离级别设置为read committed时就不会出现脏读的现象了
但是也可以明显的看出,在左边的事务中在为提交的情况下两次查询的结果不一样,也就是出现了不可重复读
当在把隔离级别提高时,又可以避免不可重复读的现象,这里就不做演示了
四种隔离级别的效率
read uncommitted>read committed>repeatable read>serializable
四种隔离级别的安全性
read uncommitted<read committed<repeatable read<serializable