首页 > 代码库 > Spring -- 5.0
Spring -- 5.0
五一过后,一直是懒散的状态,好久没有写东西了。
spring3.x企业应用开发实战 看完了第十章,写点spring中数据库吧。
数据库之前在大学里也学过,但是当时尼玛说句实话,都不知道干什么的,很多很重要的知识在当时感觉好无聊。就像你在大西北给你一个救生圈玩,好玩吗?
现在我再看这些知识,感觉好像在一艘船上,我知道这些东西很重要,是干什么用的了,关键时刻是可以救命的。也许再过两年,我的感觉是在水里。
先说说数据库事务:
大家都知道,数据库事物必须满足4个特性:原子性、一致性、隔离性和持久性。
这几个字感觉不好理解。首先我们要知道这个东西说的是数据库的事物,主语是数据库事务。
原子性这个应该还算好理解:就是说数据库事务是最小的操作单元,在一个数据库事务中的所有数据库操作(增、删、改)必须同时成功,如果有一个失败了,这个数据库事务就会回滚,让数据库返回到初始状态。
一致性这个怎么理解?事务操作完成后,数据库所处的状态和它的业务规则是相符的。
隔离性这个说的是多个数据库事务同时操作的情况。在并发数据操作的时候,不同的事务拥有各自的数据空间,它们各自的操作不会给对方带来影响。当然并不是完全无影响,这又牵涉到事务的隔离级别这个概念了(后面会看到)。
持久性指一旦事务提交以后,事务中的所有数据操作都必须被持久化到数据库中。如果事务提交后,数据库马上崩溃,在数据重启的时候也必须有某种机制保障恢复数据(数据库管理系统中的日志很详细的记录了数据库的操作记录,数据库根据日志执行数据库操作或者撤销,这就是所谓的某种机制)
我们头脑中要有一个概念,就是数据很重要,数据的正确性很重要,数据库管理系统必须保证数据的安全,保障数据的正确性(一定程度上)。对数据库事务的这四个要求就是出于这个目的。我们把数据库事务定义为对数据库操作的最小单位,把数据库的具体操作(增、删、改)放在某个事物中,保证数据库事务成功完成或者回滚,如果数据库事务成功提交,那么这个数据的状态(操作后的状态)必须符合我们对业务规则的定义!在多个数据库事务并发操作的时候,必须保证数据库事务不受其他数据库事务的影响,不然,很有可能数据库操作后,数据库的状态和我们定义的业务规则相悖,所以这里引入了数据库事务的隔离级别的概念。这个持久性说的是数据库事务提交必须真正反应到数据库中,不管发生什么情况!这样我们才能保证数据库在操作后符合我们的业务规则,也就是一致性,也可以说是数据的完整和正确性。
如果数据库的事务没有隔离性,这句话有点抽象,翻译一下就是如果一个数据事务受到另外一个数据库事务的影响。怎么影响?如果俩数据库事务操作不同的数据,那么好像他们也不会影响到对方吧?我个人理解这里的影响指的就是数据库事务操作的数据有相同的部分。如果俩数据库事务可以随意的访问数据、修改数据(数据有可能是相同的),那么就有可能出现所谓的脏读、不可重复读、幻象读和更新丢失的现象!具体这四种情况我就不做解释了,自行百度补脑。
为了避免这种情况的发生,就引入了数据库锁的概念。
如果多个事务都要对同一条数据进行操作,数据库管理系统采用数据库锁机制保证事务的隔离性(使事务不受其他事务的影响),这个和Java程序采用对象锁机制进行线程同步类似。当多个事务试图同时对相同的数据进行操作,只有持有锁的事务才能进行操作,知道事务操作完成释放锁,后面的事务才有机会对数据进行操作。
我们说说数据库锁机制,数据库通过数据库锁的机制解决并发访问的问题,数据库事务隔离性的问题。
书上写的还算可以,不过开始的时候没有看懂。数据库锁按照锁定的对象不同可以分为表锁定和行锁定,这个就没有解释的了。
从并发事务锁定的关系上看,又分为共享锁和独占锁。书上又写了,共享锁防止独占锁、但允许其他共享锁,独占锁既防止其他共享锁又防止其他独占锁。尼玛抽象了吧?看不懂了吧?翻译一下就是读和写。如果是读操作那应该是一个共享锁,因为大家都读,不会出现任何的问题,这就是所谓的允许其他共享锁防止其他独占锁!如果是(增、删、改)写操作,就是一个独占锁,它在锁定的时候,必须等到释放,其他数据库事务才能获得独占锁,否则数据库的数据肯定有问题啦。清楚了吧,哈哈。
SELECT FOR UPDATE语句隐式获得行共享锁,在Oracle中用户还可以通过LOCK TABLE IN ROW SHARE MODE语句显式获得行共享锁。通过INSERT,DELETE,UPDATE语句隐式获得行独占锁,用户还可以通过lock table in row exclusive mode语句显式获得(exclusive是专用、排外的意思)。lock table in share mode 获得表共享锁,lock table in share row exclusive mode 获得表共享行独占锁,lock table in exclusive mode 获得表独占锁。
数据库事务的隔离级别
下面的这张图片,从数据库锁引入隔离级别的概念,并说明了为什么要引入这个概念:
ANSI/ISO SQL92标准定义了4个等级的事务隔离:READ UNCOMMITED,READ COMMITED,REPEATABLE READ,SERIALIZABLE。SQL92推荐使用REPEATABLE READ保证数据的一致性。