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

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

update account 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 (读未提交):最低级别,任何情况都无法保证
隔离级别的设置只对当前链接有效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值