事物的特性及事物的隔离级别

来源:互联网 发布:围棋教学软件 编辑:程序博客网 时间:2024/06/07 01:04
  1. 第一章
  1. 事物的四个特性
  1. 原子性:就是包含的所有操作要么全部成功,要么全部失败回滚
事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
比如:转账的时候还没有成功,则就不能对数据库里面更改,如果更改则会出错
  1. 一致性:从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
比如:转账之前AB一共是500 ,那么AB不管谁向谁转账,钱都是500
  1. 隔离性:当多个用户并发访问数据库时,不能受到其他事物的影响
比如:操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
4.持久性:事物一旦提交,对数据库的改变是永久的.即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
比如:例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
  1. 不考虑事务的隔离性,会发生的几种问题
  1. 脏读:
在一个事务处理过程里读取了另一个未提交的事务中的数据
比如:用户A向用户B转账100 对应SQL命令如下
    update account set money=money+100where name=’B’;  (此时A通知B)

updateaccount set money=money- 100 where name=’A’;
当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。
  1. 2.不可重复读(update)
  2.     一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
比如:例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
  不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
  1. 3. 虚读(幻读)(insert)
非独立执行时发生的一种现象,读取了另一条已经提交的事务.
例如事务T1对一个表中所有的行的某个数据项做了“1修改“2的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
 
  1. 四种隔离级别
  1. Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
  2. Repeatable read (可重复读):可避免脏读、不可重复读的发生。
  3. Read committed (读已提交):可避免脏读的发生。
  4. Read uncommitted (读未提交):最低级别,任何情况都无法保证
隔离级别的设置只对当前链接有效
原创粉丝点击