一般指访问并可能更新数据库中各种数据项的一个程序执行单元。
开始事务(begbin transaction)到结束数据(end transaction),遇到异常需要rollback。
事务是数据进行的基本运行单位。程序只是指定事务的隔离级别。
事务四个特性
- 原子性:指事务在运行后,要么全部成功,要么全部失败回滚;
- 一致性:指事务运行前后数据从一个一致性状态到另一个一致性状态;
- 隔离性:事务之间是相互隔离,并发执行的各个事务之间不能互相干扰;
- 永久性:事务执行后,一旦提交,对数据库中数据的操作是永久性的;
事务如何保证四个特性:
- 原子性:事务遇到失败回滚的情况,将根据undo.log日志进行回滚;
- 一致性:一致性是由其他三个特性保证的;
- 隔离性:
使用锁:事务在运行过程中,对于读数据加共享锁,对于写数据加写锁,其中共享锁与共享锁不互斥外,共享锁和写锁,写锁和写锁之间是互斥的;
为解决共享锁和写锁之间的互斥,采用另一种MVVC,即在读取数据时采用快照的方式,这样不会与写锁产生互斥,事务都有自己的transaction_id,事务启动时先获取行数据的rowid,在提交时会判断rowid是否一致再判断是否提交事务。
- 永久性:redo.log保证当数据库出现问题时可以及时恢复数据;
事务的隔离级别:
- 读未提交:事务写数据时不允许其他事务写但可以读,导致读到其他事务未提交修改的数据
- 读已提交(Oracle默认隔离级别):指同一事务中两次读取到的结果不一致,使用行锁可以解决
- 可重复读(MySql默认隔离级别):指同一事务相同条件下两次读取到的结果不一致,行锁不能控制增加或删除其他行数据
- 序列化:指本次事务序列化修改完毕之后才允许其他事务进行修改
事务的传播机制
required:若当前存在事务,则加入到事务中,若当前不存在事务,则新建事务;
supports:若当前存在事务,则加入到事务中,若当前不存在事务,则以非事务方式运行;
required_new:若当前存在事务,则嵌套子事务运行,与原事务无关;
not_supports:始终以非事务方式运行;若存在事务,则将事务挂起;
mandatory:强制以事务方式运行:
never:不使用事务,存在事务则抛出异常;
nested:存在事务则新建事务,若原事务回滚,则nested事务一起回滚,但nested事务异常,原事务不回滚
spring事务失效场景
1)首先spring使用@transactional注解标注事务,当@transational注解添加到非public方法时会导致事务失效;可通过修改方法为public或使用代理的方式解决;
2)同时,@transaational注解指支持未检查异常(程序运行中会产生的runtimeexception),不支持已检查异常(需要trycatch捕获,不处理不能通过编译),;可以通过rollbackfor属性指定异常类型解决;
3)同时,若标明了需要事务回滚的异常后,需在catch处抛出异常;
4)@transational注解的类不被spring管理;可以通过使用@service或其他可生成bean注解;
5)事务类使用this调用本身方法,spring事务的原理是aop动态代理,当不存在代理对象调用时,事务不会生效;
6)数据源不支持事务同样会导致事务失效;
7)传播类型不支持事务一样会导致事务失效;