什么是事务?

事务就是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行,事务是一组不可再分割的操作工作集(工作逻辑单元)

事务的种类?

编程式事务管理Transaction Template。
声明式事务管理 它是建立在Aop之上的,本质是通过Aop功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前执行一个事务,在执行完目标方法之后根据执行情况提交或回滚事务。
它是通过注解@Transactional的方式,但是它最多只能作用到方法,无法做到像编程是事务管理那样作用到代码块。

事务的属性?

①原子性:事务是一组不可分割的操作单元,这组单元要么同时成功要么同时失败(由DBMS的事务管理子系统来实现)
②一致性:事务前后的数据完整性要保持一致(由DBMS的完整性子系统执行测试任务)
③隔离性:多个用户的事务之间不要相互影响,要相互隔离(由DBMS的并发控制子系统实现)
④持久性:一个事务一旦提交,那么它对数据库产生的影响就是永久的不可逆的,如果后面再回滚或者出异常,都不会影响已提交的事务(由DBMS的恢复管理子系统实现的)

事务传播属性?

Required:如果有事务就在此事务内运行,没有就重新启动一个事务,并在此事务内运行。Required_New:必须重新启动一个事务,并在自己的事务内运行,如果有事务则将它挂起。
Supports:如果有事务就在此事务内运行,没有则不能运行在事务中。
Not_Supports:不能运行在事务中,如果有事务就讲它挂起。
Mandatory:必须运行在事务内部中,如果没有正在运行的事务,就抛出异常。
Never:当前事务不能运行在事务中,如果有正在运行的事务,就抛出异常。
Nested:如果有事务在运行,当前方法就应该在这个事务的嵌套内部执行,否则,就启动一个新的事务,并在自己的事务内运行

事务的隔离级别?

当应用程序中的多个事务在同一数据集上并发执行时可能出现许多意外,并发执行所导致的三个问题:
脏读:对于两个事务T1,T2, T1读取了已经被T2更新但是还没有提交的事务,若T2回滚,T1读取的内容就是无效的。
不可重复读:对于两个事务T1,T2, T1读取了T2的一个字段,然后T2更新了该字段,T1在去读取同一个字段,值就不同了。
幻读:对于两个事务T1,T2, T1读取了T2的一个表格,然后T2在该表格中插入了新的数据,T1在读同一个表,就会出现多行。Read_Uncommitted:允许事务读取其他未被提交的变更,脏读,不可重复读,幻读,都可能会出现。
Read_Committed:只允许事务读取已经被其他事务提交的变更,可以避免脏读,不可重复读和幻读任然有可能出现。
Repeatable_Read:确保事务可以从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但是幻读任可能出现。Serializable:确保一个事务可以从一个表中读取相同的数据,在这个事务持续期间,禁止其他事务对这个表进行插入,更新,删除操作,可以避免所有并发事务。
oracle支持两种事务级别Read_Committed(默认)和Repeatable_Read。
mysql四种事务隔离级别都支持,默认是Repeatable_Read