1:什么是事务:
事务是一系列操作的集合,这一系列操作可以看成一个工作单元;
也可以说是一个工作单元;
2:事务执行的结果:
要么commit;要么rollback;
3:事务的4个小特性:(面试的时候一般都会问这个问题)
a)原子性:
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。<o:p></o:p>
b )一致性(consistency):<o:p></o:p>
指的是事务执行前后的系统状态必须保持“一致”。比如说,某一事务中涉及到了户头之间的转账。那么,consistency 就是说,不管有多少户头参与了转账,也不管转了多少钱,最终总的钱数目必须与事务执行前的总数目一致。---- 当然,不考虑跨银行转账的问题。<o:p></o:p>
C)隔离性:
只有在事务的并发执行的时候才涉及到事物的隔离性;
由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。<o:p></o:p>
d)持久性:<o:p></o:p>
事务完成后,它对系统(可理解成为数据库)的影响是持久的;<o:p></o:p>
4:事务并发执行引起的问题(注意事务A和事务B 的执行的先后顺序)<o:p></o:p>
(1) lost update:
A和B事务并发执行,A事务执行update后,提交;B事务在A事务update后,B事务结束前也做了对同样数据的update操作,然后rollback,则两次提交操作都丢失了。
(2) dirty read:<o:p></o:p>
A和B事务并发执行,B事务执行update后,A事务select B事务没有提交的数据,B事务roolback,则A事务得到的数据不是数据库中的真实数据。也就是dirty data(和数据库中不一致的数据)
(3) unrepeatable read:(不可重复的读)
unrepeatable-read简而言之是因为事务B对数据进行那update(更新操作),导致事务A前后2次对数据进行select(读操作)(一次是发生在事务B update数据之前,一次是update之后;)时,读取的数据不同;<o:p></o:p>
【A和B事务并发执行,A事务select数据,然后B事务update该数据,A再次select该数据时,发现该数据变化了。】
(4) phantom read:(幻读)
A和B事务并发执行,A事务select数据,B事务insert或者update数据,A事务再次select发现结果集中有以前没有的数据或者以前有的数据消失了。
注意:以上事务的并发所引起的问题,都是2个事务(或多个事务)并发对一组相同的数据进行操作所 引起的;
所谓的幻读,脏读,不可重复读。大家可以从名字上就知道个大概;幻读,脏读,不可重复读中间都有一个“读”
字,可见,当2个事务并发执行的时候,其中一个事务A肯定有读的操作。而另外一事务B只是更新了事务A所读取
过的数据,而事务A再次读的时候就和第一次读的时候有所变化那;所以才有了脏读,幻读,不可重复读的 问题
3.事务的隔离级别
在企业应用中,事务往往存在于并发执行的环境当中,那么如果做到并发事务之间完全的isolation,做到对于以上四大问题完全解决,那么势必会影响程序的performance和scalability,因此减弱这种完全的isolation,而带来的就是performance和scalability的提高。因此事务的隔离级别根据以前的四大问题有四种。
(1)read uncommitted isolation:不允许(1)问题存在,允许(2)问题存在。写事务执行时不允许同时有其他的写事务并发执行。
(2)read committed isolation:不允许(2)问题存在,允许(3)问题存在。读事务允许其他事务并发执行,没有提交的写事务执行时不允许同时有其他并发事务执行。
(3)repeatable read isolation:不允许(3)问题存在,允许(4)问题存在。读事务不允许写事务并发执行,没有提交的写事务执行时不允许同时有其他并发事务执行。
(4)serializable:完全解决问题。<o:p></o:p>

被折叠的 条评论
为什么被折叠?



