事务是什么?
事务是指中一个逻辑工作单元中的一系列操作,这一系列操作要么都成功执行,要么都失败,不执行。一个逻辑单元要成为一个事务,必须满足事务的四个特性(A原子性,C一致性,I隔离性,D持久性),事务是数据库的一个逻辑单元,事务是由DBMS中的事务管理子系统管理。
最简单的例子,银行转账业务,A账户转账给B账户,其中就包含了两个操作:A帐户扣款,B帐户叠加转账金额。
其中,
原子性就是指这两个操作要么都成功,要么都失败(不执行,回滚)。
一致性就是指事务执行前和执行后仍然处于一致状态,仍然满足完整性约束。如上,在这个事务执行前 和 执行后 A帐户和B账户的总金额不变。
隔离性是指事务在并发的时候,一个事务读取数据的时候,该条数据是否被另外一个事务所影响,通过隔离级别来控制。如,A账户给B账户转账的时候,C帐户也在给B帐户转账,这个时候就需要其中一个人转账成功之后,另一个人才能转账,这个时候就需要隔离级别来控制。
持久性是指事务执行之后数据被持久化永久保存下来,即使机器停下来,也不会丢失,对系统的影响是永久的。
隔离级别
在事务并发的情况下,由于事务间的相互影响,会发生很多问题,比如更新丢失,读到脏数据等,所以在事务并发的时候,我们需要通过隔离级别来控制事务间的影响。
隔离级别有以下几种:
读未提交(Read Uncommitted),如一个事务更新之后还没有提交,其他的事务也可读取更新之后的状态。这种很容易出错,几乎很少使用。
读已提交(Read committed),一个事务更新提交之后,其他的事务才能读取到更新的状态。这是大多数数据库默认级别
可重复读(Repeatable Read),同一个事务两次或多次同样的对数据内容查询,如果得到的结果是一样的,但不保证得到的数据条数是一样的,只要存在读改行数据就禁止写。这是mySQl的默认级别。
串行化(Serializable),事务一个个的执行,一个事务提交之后,另外一个事务才能执行,这样就不能事务并发,完全的把每一个事务隔离开了,这个是最高级别,也最安全,但是执行的效率很低,一般也不会用这个中级别。