数据库事务的四大特性以及事务的隔离级别
所谓事务就是操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号 增款,这两个操作要么都执行,要么都不执行。
数据库有四大特性:原子性、一致性、隔离性、持久性 (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)方法。
差不多就是这些啦 ! 第一次写这个,就当是记录了 !有不足之处还请见谅,当然这里参考了很多前辈们写的东西,感谢他们的分享。每天进步一点点,加油
!