事务是对数据库进行一系列操作的语句组成的执行单元,用begin、commit、rollback来执行
事务的四个特性
原子性
原子性就是一个事务要么所有的操作都成功,要么所有的操作都失败。
如果有一个操作失败了,则立即回滚到开始事务之前的状况,该事物当前所有的操作都不作数。
一致性
一致性是指事务开始前的总的数据情况和事务提交后的总的数据情况一致。
比如说:数据记录中总共有100 元,里面有若干人占据了这些钱,修改其中一些人的钱的数,使他们占有的钱数改变,但总的钱数不能变。
如果一事务给a扣10元给b加十元,有另一事务也给a扣十元给c加十元,它们同时读了a的钱数没减的数据,并扣十元,结果a总共只扣了十元,而b、c一共加了20元,出现了脏读。
隔离性
隔离性指的是事务之间不干扰,每个事务都单独占用数据资源,防止其他事务干扰导致数据出错。
但事务之间的隔离性会造成数据库性能有所下降,隔离性也不是越高越好,根据事务中可能出现的问题可设置隔离性的级别。
持久性
事务中的操作一旦提交,就对数据库永久有效
事务中出现的问题
脏读
一个事务读另一个事务未提交的数据
比如:事务a查询价格,并准备减1减后提交,在a提交之前,事务b又查询价格并减1提交。b查询到的是a还没修改的,导致a之后虽然提交了数据,但b 后来提交的数据和a没关系,直接覆盖了a的操作,总共只减了1而不是2。
不可重复读
一个事务前后两次查询同一个数据,结果不一样
针对一行数据的变动。
两次查询中间有其他事务修改该行数据,导致结果不一样
幻读
一个事务两次查询同一个数据,结果数目不一样
针对数据表的变动。
中间有其他事务把该表加或减一行,导致结果数目不一样
事务的隔离性
串行化
不会出现脏读,不可重复读,幻读等情况,隔离性最高。
可重复读
不会出现脏读,不可重复读的情况
读已提交
不会出现脏读
读未提交
什么都不能保证
以上是自己学习的理解,可能个别有不准确的地方