一、事务。
事务是指一个单元的工作,这些工作要么全做,要么全不做。事务处理可以确保所有操作都成功完成,否则不会永久更新面向数据的资源。事务有ACID属性(Atomicity原子性,Consistency一致性,Isolation隔离性,Durability持久性。)
原子性指事务必须是源自工作单元,对于数据修改要么全都执行,要么全都不执行。通常于某个事务关联的操作具有共同的目标,并且相互依赖。原子性消除了系统处理操作自己的可能性。
一致性是指事务在完成时,必须使所有的数据都保持一致状态,在相关数据库中,所有规划都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都必须正确。
隔离性是指有并发时间所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据是,数据所处的状态要么是另一并发事务修改它之前的状态,要么是另一事物修改它之后的状态。事务不会查看中间状态的数据,这成为可串行行,因为它能够重新装载其实数据,并且重播一系列事务,意识数据结束时的状态与原始事务 执行时的状态相同,事务可串行化时将获得最高的隔离级别。
持久性是指事务完成之后,对于系统的影响具有永久性,该修改即使出现致命的系统故障也将一直保持。
在Hibernate中使用事务的步骤如下:1、事务开始
在多个事务同时使用相同的数据时可能会发生问题,即并发问题。主要有四个并发问题。
丢失更新,即两个或多个事务选择同一行数据,基于最初选定的值进行根性,会发生更新丢失问题,导致前一个事务所做的更新被第二个事务的更新覆盖了; 脏读,即当第二个事务选择其他事务正在更新的行时,会发生未确认的相关性问题,即第二个事务正在读取的数据还没有确认并且可能有更新慈航的事务所更改,那么就可能读取到脏数据了; 非重复读,当第二个失误多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题,就是第二次读取数据的时候可能原始读取的数据被更改了,导致不能独到原始的数据; 幻象读,党对某行进行插入或删除时,而该行正在读取的范围时,会发生幻象读。
并发问题的解决方案就是对事务进行加锁,有共享锁(为读访问锁住数据,防止其他事务更改),排他锁(用于每一次数据的更新会阻止其他事务访问数据)等锁。
事务准备接受不一致数据的级别成为隔离级别。较低的隔离级别可以提高并发性,但代价是降低数据的正确性,相反,较高的隔离级别可以确保数据的正确性,但肯恩归队并发产生负面影响。在Hibernate中的事务隔离级别如下四种:
1)、1级读操作未提交,允许脏读,不允许更新丢失。如果一个事务已经开始写数据,则不允许另外一个事务同时进行写操作,但允许其他事物进行读操作。
2)、2级读操作已提交,允许不可重复读取,但不允许脏读取。读取数据的事务允许其他事物继续反问该行数据,但是未提交的写事务将会禁止其他事务访问该数据。
3)、4级可重复读,禁止不可重复读取和脏读取,但是有时肯恩改行粗线幻想读取数据,读取数据的事务将会禁止写事务,但允许读事务,写事务则禁止其他事务。
4)、8级可串行化,提供严格的事务隔离,要求事务序列化执行,事务职能一个接着一个执行,不能并发执行。
配置代码如下:<property name="hibernate.connection.isolation"> 4 </property>
三、悲观锁和乐观锁。
悲观锁假定任何时刻存取数据时都可能有另一个事务也正在存取同一数据,因而采取了对数据库层次的多顶状态。在锁定的实践内其他事务不能对资料进行存取,这样很有可能造成长时间等待。在Hibernate中可以通过设定锁定模式实现。session.lock(student, LockMode.UPGRADE);
乐观锁则认为当前事务操作数据库资源是,很少或不会有其他事务同时访问该数据资源,因此不用数据库级别上的锁定,完全依靠数据库的隔离界别来自动管理所的工作。主要在乐观锁定中对应用程序采用版本控制手段来避免可能出现的并发问题。在Hibernate中主要有版本控制功能。有两种元素来实现版本控制功能。<version>元素利用一个递增的证书来跟踪数据库表中记录的版本;<timestamp>元素则用时间戳来跟踪数据库表中的记录的版本。