事务的概念
事务是由用户定义的一个数据库操作序列,该组序列对数据库的操作要么都成功,要么都失败。有开启边界(事务开启)和结束边界(事务结束),结束边界又分为提交和回滚。
事务的特性
事务具有ACID四大特性
1.原子性(Atomicity):
事务是对数据库操作的一个最基本的单元,不可再分割。一个事务中的操作要么都成功,要么都失败。
2.一致性(Consistency):
事务执行的结果必须是使数据库从一个一致性状态转变到另一个一致性状态。
3.隔离性(Isolation):
每个事务之间相互独立,不能互相干扰。
4.持续性(Durability)
一个事务一旦提交,它对数据库的改变是永久性的,之后的其他操作不应该对其执行结果由任何影响。
事务的隔离级别
一、事务的并发读问题
1.脏读:一个事务正在访问数据,并对数据进行了修改,但是在还没有提交到数据库中时,另一个事务也访问到了该数据,并读取到了修改前的数据。即读取到了脏数据。
2.不可重复读:对同一记录的两次读取不一致,这是因为在第一个事务重复读取数据的时候,另一个事务对数据进行了修改,导致了第一个事务在重复读取时读到了不一样的数据。
3.幻读(虚读):幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中的所有行中的一个数据做了从“1”改为“2”的操作,这是事务T2刚好又对该表中插入了一行数据,而这行数据还是该项数据还是“1”。而操作T1的用户,在操作完成以后马上查看表记录,会发现有一行数据没有该过来,其实这行其实是T2刚刚提交的。对于T1操作员来说就好像幻觉一样,所谓幻读。
二、四大隔离级别
MySQL数据库为我们提供了四种隔离级别,四个等级的事务隔离级别,在相同数据下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的执行结果。不同事务隔离级别能够解决的数据并发问的能力是不同的。
1.串行化(Serializable):提供严格的事务隔离。它要求事务序列化执行,只能一个一个的读取,并不能并发执行。可避免脏读,不可重复读和幻读。
2.可重复读(Repeatable read):禁止不可重复读取和脏读,但是有时可能出现幻读。
3.读已提交(Read commited):可避免脏读。但是可以通过悲观锁和乐观锁来进行控制。
4.读未提交(Read uncommitted):最低级别,什么都不能保证。
以上四种的方式的隔离级是由高到低。而对于并发的支持则是由低到高。
在MySQL数据库中,支持以上四种隔离级别,默认隔离级别为可重复读(Repeatable read);然后Oralcle数据库只支持串行化(Serializable)和读已提交(Read commited),默认的是读已提交(Read commited)(PS:所以这样来说,Oracle的性能高于MySQL咯?)。
事务在Spring当中的应用(注解方式)
1.在Spring的配置文件ApplicaitonContext.xml中配置事务管理器,并在其中加载数据源。
<!--加载事务配置文件--> <bean id="transactional" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
2.在Spring的配置文件ApplicaitonContext.xml中开始事务注解扫描。
<tx:annotation-driven transaction-manager="transactional"/>
3.在需要使用事务管理的方法上面加上@Transactional注解即可进行事务管理。
略。