关于事务的知识

           数据库事务的四大特性以及事务的隔离级别

   所谓事务就是操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号  增款,这两个操作要么都执行,要么都不执行。

   数据库有四大特性:原子性、一致性、隔离性、持久性 (ACID) 四个英文单词首字母缩写 

    (1)原子性: Atomicity  指事务包含的操作  要么全部执行,要么全部回滚。

   (2)一致性:Consistency  指事务执行前和执行后都必须处于一致性的状态。

                         举个栗子:小明有100元 小红有50元    小明给小红转账100元,那么小明就剩0, 小红就有200元。意思是说,他们在转账前 加起来有200元  转账后加起来也只能有200元。  转账这个操作就是一个事务。

        (3)隔离性:Isolation    当有多个用户并发访问数据库时,不会在相互之间产生干扰。

                         举个栗子:小明和小刚 同时给小红转账,在数据库执行的时候,肯定是有一个先后顺序的。注意,这里就有两个  事务。它们是在一个完成了转账之后 再进行下一个转账,相互之间不会影响。

                                隔离性需要重点说下,在稍后会具体介绍、、、、、、
         

      (4)持久性:Durability  指 事务一旦被成功提交后,对数据库的更改是永久性的,即使是数据库发生了故障也不会丢失提交事务后的数据 。


   以上简单明了的介绍了一下事务的四大特性,有不足之处还请指正。下面介绍下隔离性这种东东。。。。

    首先讲一下我们常用数据库(我只用过mysql、oracle)为我们提供的事务隔离级别:

  从低到高的级别排序:  
  1.Read uncommitted(读未提交) :最低级别,任何情况都无法保证
                2.Read committed(读已提交) :  可避免脏读的情况发生
                3.Repeatable Read(可重复读) :    可避免脏读和不可重复读
               4.Serializable (串行化又叫序列化) :最高级别,可避免脏读、不可重复读、幻读的发生。
   
   mysql数据库的默认隔离级别是:Repeatable Read 可重复读  (当然它支持四种隔离级别) 
  
   Oracle数据库的默认隔离级别是:Read committed 读已提交  (注意啦!!! oracle只支持两种隔离级别: 一个是默认的,另一个是Serializable

          一般来说,级别越高,执行的效率越低。像Serializable这种 它是通过锁表的形式使其他线程等待,等这个线程执行完了再去执行其他线程,所以它可以避免脏读、不可重复读、幻读的发生。但是要结合效率和各方面因素。

        接着我们介绍上面提到的几个词:脏读、不可重复读、幻读是什么意思。

         如果不考虑隔离级别的话,就可能产生以下的问题:

脏读:指一个事务在处理过程中读到了另一个事务未提交的数据。即读到了脏数据
           何为脏数据,还是举个栗子:财务给员工发2000元工资,其中会涉及数据  员工+2000  财务-2000 当财务执行完第一条 员工+2000时 就通知员工查看工资。此时员工确实看到自己工资到账了,但是财务突然发现该员工工资多发了100块,所以没有提交事务, 财务-2000 这个操作没有执行,事务回滚。那么员工看到自己工资+2000  就是一个脏数据。

不可重复读:指在一个事务范围内,读取同一条结果,得到了不同的值。这是因为在读取的间隔,数据被另一事务修改并提交了
                     
                     例如:银行想查询A帐户余额,第一次查询A帐户为200元,此时A向帐户内存了100元并提交了,银行接着又进行了一次查询,此时A帐户为300元了。银行两次查询不一致,可能就会很困惑,不知道哪次查询是准的。

                   不可重复读和脏读的区别是:脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据

幻读:一般是针对多笔记录。指同样一笔查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。
                    
                       例如:银行做报表统计account表中所有用户的总额为500元,途中插入新的一笔金额100元,这时银行再统计发现帐户为600元了.

                      幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。 幻读的重点在于新增或者删除 (数据条数变化)

查询数据库的隔离级别:mysql数据库查询当前事务隔离级别:select @@tx_isolation
                                  mysql数据库设置事务隔离级别:set transaction isolation level 隔离级别名
                                                                                eg:set transaction isolation level  read committed;
                                  记住:设置数据库的隔离级别一定要是在开启事务之前!

       如果感兴趣 ,可以查查 使用JDBC对数据库的事务设置隔离级别,它是通过调用Connection对setTransactionIsolation(level)方法。

       差不多就是这些啦 ! 第一次写这个,就当是记录了 !有不足之处还请见谅,当然这里参考了很多前辈们写的东西,感谢他们的分享。每天进步一点点,加油 !              




                    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值