事务的基本原理:spring
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是没法提供事务功能的。对于纯JDBC操做数据库,想要用到事务,能够按照如下步骤进行:数据库
数据库隔离级别并发
隔离级别 | 隔离级别的值 | 致使的问题 |
Read-Uncommitted | 0 | 致使脏读 |
Read-Committed | 1 | 避免脏读,容许不可重复读和幻读 |
Repeatable-Read | 2 | 避免脏读,不可重复读,容许幻读 |
Serializable | 3 | 串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重 |
脏读:一事务对数据进行了增删改,但未提交,另外一事务能够读取到未提交的数据。若是第一个事务这时候回滚了,那么第二个事务就读到了脏数据。性能
不可重复读:一个事务中发生了两次读操做,第一次读操做和第二次操做之间,另一个事务对数据进行了修改,这时候两次读取的数据是不一致的。spa
幻读:第一个事务对必定范围的数据进行批量修改,第二个事务在这个范围增长一条数据,这时候第一个事务就会丢失对新增数据的修改。接口
总结:事务
隔离级别越高,越能保证数据的完整性和一致性,可是对并发性能的影响也越大。ci
大多数的数据库默认隔离级别为 Read Commited,好比 SqlServer、Oracle开发
少数数据库默认隔离级别为:Repeatable Read 好比: MySQL InnoDBget
对于项目中须要使用到事务的地方,我建议开发者仍是使用spring的TransactionCallback接口来实现事务,不要盲目使用spring 事务注解,若是必定要使用注解,那么必定要对spring事务的传播机制和隔离级别有个详细的了解,不然极可能发生意想不到的效果。