您的位置:首页 > 编程语言 > Java开发

spring数据库事务总结

2018-03-05 21:59 211 查看

事务管理器

spring中数据库事务是通过PlatformTransactionManager进行管理的,通过它完成事务的创建、提交和回滚。

spring中约定,事务产生异常时回滚,无异常时会提交事务。

spring中会将事务委托给transactionManager,mybatis中常用的数据库事务管理器是DataSourceTransactionManager,它继承AbstractPlatformTransactionManager,而后者实现了PlatformTransactionManager。

声明式事务

在spring中可以使用声明式事务和编程式事务,现在编程时事务几乎已经不再在企业中使用,因为代码可读性差。声明式事务又可以分为xml配置和注解事务,主流的方法是使用@Transaction注解声明事务。

使用声明式事务需要配置注解驱动,加入以下配置就可以使用@Transactional配置事务了。

<tx:annotation-driver transaction-manager="transactionManager"/>


声明式事务底层原理是spring AOP 技术。

数据库事务特性

数据库事务正确执行的基础要素是原子性、一致性、隔离性和持久性。

1. 隔离级别

事务的隔离级别包括脏读(dirty read)、读/写提交(read commit)、可重复读(repeatable read)、序列化(serializable)。脏读是允许一个事务去读取另一个事务中未提交的数据

(可以参考P345例),从而引起业务数据错误,若是金融项目会引发风险。为了克服脏读,sql提出了第二个隔离级别–读/写提交,一个事务只能读取另一个事务已经提交的数据。

选择隔离级别的出发点在于:1、性能;2、数据一致性。

大部分场景下,企业会选择读/写提交的方式设置事务。一般,从脏读到序列化系统性能直线下降,选择隔离级别高的比如序列化,会严重压制并发,从而引起线程挂起,直到获得锁才会进一步操作,总之,隔离级别需要根据并发的大小和性能做出决定,对于并发不大又要保证数据安全性的可以使用序列化的隔离级别,这样就保证了多事务环境下数据一致性问题。

@Transactional隔离级别的默认值是Isolation.DEFAULT,它会随数据库默认值的变化而变化。一般使用Isolation.READ_COMMIT

2. 传播行为

即 一个方法调用另一个方式可以对事务的特性进行传播配置。默认值Propagation.REQUIRED。

@Transaction(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMIT)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: