数据库事务的特性
原子性
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性
事务前后数据的完整性必须保持一致。
隔离性
并发操作数据时,不同事务的操作不会对彼此产生干扰。
持久性
事务一旦被成功提交,其对数据库中数据的改变是永久性的,即使数据库发生故障也不应该对其有任何影响。
隔离级别
类型 | 描述 |
---|---|
脏读 | 事务1对数据有修改操作,但修改未提交的情况下,事务2使用了该数据,因为这个数据还没提交,所以另一个事务读取的数据是脏数据。 |
不可重复读 | 同一事务中,多次读取同一数据返回的结果不一样 |
幻读 | 事务1查询数据,不存在某个数据则新增,在此新增操作未执行前,事务2新增了此数据,在事务1再次查询数据的时候,就出现了数据不一致 |
1. ISOLATION_DEFAULT
默认的隔离级别,使用数据库默认的事务隔离级别。
SqlServer、Oracle默认Read Commited;
MySql默认Repeatable Read。
在隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。
2. ISOLATION_READ_UNCOMMITTED
读未提交,事务最低的隔离级别。在并发事务中,允许一个事务可以读到另一个事务未提交的更新数据。
会出现脏读、不可重复读、幻读。
3. ISOLATION_READ_COMMITTED
读已提交。在并发事务中,保证一个事务修改的数据提交后,才会被另一个事务读取到。
会出现不可重复读,幻读。
4. ISOLATION_REPEATABLE_READ
可重复读。此隔离级别可以防止脏读、不可重复读。一般采用快照的方式实现。
可能会出现幻读。
5. ISOLATION_SERIALIZABLE
序列化顺序执行事务,事务最高的隔离级别,但是花费时间最高。可以避免脏读,不可重复读,幻读。
传播机制
1. PROPAGATION_REQUIRED (默认的传播机制)
在事务环境下被调用,就加入该事务;否则为其创建一个新事务。
2. PROPAGATION_SUPPORTS
在事务环境下被调用,就加入该事务;在非事务环境下被调用,就以非事务的方式运行。
3. PROPAGATION_MANDATORY
业务方法只能在事务环境中运行
,不能发起自己的事务;如果在非事务环境下运行,则抛出异常。
4. PROPAGATION_REQUIRESNEW
不管是否存在于事务中,都会为其起一个新事务。
如果被调用的业务方法,存在于事务中,则原事务挂起,新事务被创建,直到新事务执行结束,原事务才会恢复执行。
事务相互隔离,回滚成功失败互不影响,但外层事务可以捕获内层抛出的异常。
5. PROPAGATION_NOT_SUPPORTED
业务方法不需要事务。
如果业务方法在事务环境下被调用,该事务会被挂起,直到业务方法执行完成,原先的事务才会恢复执行。
外层回滚不影响内层操作,但是抛出的一样可以被外层事务捕获。
6. PROPAGATION_NEVER
业务方法绝不能在事务范围内执行。
如果业务方法在事务环境下被调用,就会抛出异常;只有在非事务环境下,才能正常执行。
7. PROPAGATION_NESTED
如果没有活动事务,则按REQUIRED属性执行。
它使用了一个单独的事务,拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSource TransactionManager事务管理器有效。
开启一个嵌套的事务,它是已存在事务的子事务。嵌套事务开始执行时,它将取得一个保存点,如果这个嵌套事务执行失败,将会回滚到此保存点,嵌套事务是外部事务的一部分,只有外部事务结束后,它才会被提交。