数据库的事务控制和四种隔离级别
数据库的事务控制
原子性:
事务操作不可分割 要么同时成功要么同时失败
一致性:
事务操作前后, 用户获取的数据都是正确的.
隔离性:
每个事务的操作各自独立,互补影响
持久性:
事务一旦提交之后,就会在数据库中保存. (数据落地-保存到磁盘中)
数据库事务控制 :根本原因就是并发问题
三种并发问题
(两个事务(要做或者所做的事情)在并发执行的情况下)
脏读:
事务A读取了事务B更新了但是没有提交的数据,然后事务B进行了回滚,导致事务A读取的数据是错误数据。
不可重复读:
事务A两次读取的数据不一致,也就是在事务A进行业务操作的过程中事务B 将数据进行了更新或删除。导致事务A两次读取的数据不一致。
幻读:
事务A根据条件得到x条数据,然后事务B改变了表中除了这N条数据之外的数据,或者添加了符合事务A条件的数据导致事务A再次根据条件得到的数据是原来的加上事务B修改条件后符合要求的。(也就是说同一条件下同一张表第二次比第一次读取到的行数)
四种隔离级别
(通过隔离级别的设置可以对应避免一些事务并发问题)
串行化(Serializable):
也就是将并发执行改为串行一个一个执行,它可以解决三种并发事务问题,但是会导致执行的效率非常低。
可重复读(REPEATABLE READ)(Mysql默认隔离级别):
它解决了不可重复读和脏读的问题,其实就是事务操作的过程中限制了update(更新的)或者删除的操作,但是避免不了幻读,因为幻读是因为插入操作引起的。
读已提交(READ COMMITTED)( SQL Server和Oracle的默认隔离级别):
只能读到已经提交了的数据,保证一事务A不会读到另外一个并发的事务B已修改但是没有提交的数据,直接避免了脏读,但不能避免不可重复读和幻读。
读未提交(READ UNCOMMITTED):
可以读到未提交的数据,这种隔离级别的一致行最差,使用它三种并发问题都解决不了