1.什么是事务:事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。
在关系数据库中,一个事务可以是一条sql语句,或一组sql语句,或整个程序。
2事务的四个特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)
原子性:事务是数据库的逻辑工作单位,不可分割。eg:一个事务中有两个操作系列,分别是A要减少1w元,B要增加1W。这相当于A要转给B 1w元,这两个操作序列要么全做或都不做,不能只做其中一个,否则就破坏了原子性。
一致性:事务的执行结果必须是使数据库从一个一致性状态转到另一个一致性状态. eg:A有5000元,B有5000元,一共是10000元,现在有一个事务是A转给B4000元(A要减少4000元,B要增加4000元),如果只做操作序列中的一个(eg:A要减少4000元),则事务的执行结果为A有1000元,B有5000元,一共是6000元,这与事务执行前的10000元,不符,所以这就不符合一致性。无论执行多少次事务,AB的总和一定要是10000元,这就是一致性。
隔离性:当一个事务执行时,其他事务不能执行。
持久性:事务一旦提交成功,对数据库中的改变是永久的,不能因为数据库错误而导致提交成功而数据库中的数据未改变。
在进行数据库操作时可能产生的几种问题1,2,3
1:脏读:eg:员工A的工资10000元,到了开工资的日子,老板手一抖转了100000元,但是老板此时还没有提交,就在这时A查看自己开了多少工资,一看,哇,10W,无比的开心,老板提交之前发现了这个失误,于是把10W改回了原来的1w,并提交。后来A想确认一下,是不是自己眼花了,又查了自己的账户,发现是1W,不是10w(白白的高兴了一场)。这就是脏读:就是读到了还没有提交的数据。
2:不可重复读:eg:老板A在超市买东西时,付款时查询时候发现卡里有10w元,此时他的妻子把钱全部转走借给了闺蜜,并提交事务,此时超市扣款时发现余额不足,(老板懵了)哈哈。这就是不可重复读(Read committed):就是读到了还已经提交的数据。
3:幻读:A对数据库表中修改了某一条数据,此时B对数据库这个表中增加了一条数据,当A再次读取表时,发现多了一条数据,就好像产生了幻觉一样。
为了解决这些问题,就要了解一下数据库事务的隔离级级别了。
数据库的事务四种隔离级别:1,2,3,4
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。