spring---事务处理---学习记录---21.05.15

21.05.15

什么是事务

事务是指一组sql语句的集合,集合中有多条sql语句可能是insert , update , seleat , delete,我们希望这些多个sql语句都能成功,或者都失败,这些sql语句的执行是一致的,作为一个整体执行。

事务的两种状态:

事务的提交:是指事务里的所有操作都正常完成。

事务的回滚:是指程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。

什么时候会使用事务

当我的操作,涉及得到多个表,或者是多个sql语句的insert,update,delete.需要保证这些语句都是成功才能完成我的功能,或者都失败,保证操作是符合要求的.

在java代码中写程序,控制事务,此时事务应该放在service类的业务方法上,因为业务方法会调用多个dao方法,执行多个sql语句

使用JDBC访问数据库,还有mybatis访问数据库怎么处理事务

jdbc访问数据库,处理事务 Conneaton conn ; conn. commit (); conn .rollback();

mybatis访问数据库,处理事务 sqISession. commit(); Sqlsession. rollback();

上述处理事务的方式的不足

1)不同的数据库访问技术,处理事务的对象,方法不同,需要了解不同数据库访问技术使用事务的原理

2)掌握多种数据库中事务的处理逻辑。什么时倾提交事务,什么时候回顾事务3)处理事务的多种方法。

总就是多种数据库的访问技术,有不同的事务处理的机制,对象,方法。

spring事务处理(解决了上述的不足)

spring提供一种处理事务的统一模型,能使用统一步骤,方式完成多种不同数据库访问技术的事务处理.使用spring的事务处理机制,可以完成mybatis访问数据库的事务处理

使用spring的事务处理机制,可以完成hibernate访问数据库的事务处理。

spring处理事务的模型,使用的步骤都是固定的。把事务使用的信息提供给spring就可以了
1)事务内部提交,回滚事务,使用的事务管理器对象,代替你完成comnmit,rollback
事务管理器是一个接口和他的众多实现类。
接口:PlatformTransactionManager,定义了事务重要方法commit , rollback实现类: spring把每一种数据库访问技术对应的事务处理类都创建好了

mybatis访问数据库—spring创建好的是DataSourceTransactionManager
hibernate访问数据库----spring创建的是HibernateTransactionManager

在这里插入图片描述

需要告诉spring 你用是那种数据库的访问技术
声明数据库访问技术对于的事务管理器实现类,在spring的配置文件中使用bean>声明就可以了例如,你要使用mybatis访问数据库,你应该在xml配置文件中

<bean id="xxx" class="...DataSourceTransactionManager">

2)你的业务方法需要什么样的事务,说明需要事务的类型

说明方法需整的事务:

1)事务的隔离级别:

第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据
解决了更新丢失,但还是可能会出现脏读

第二种隔离级别:Read committed(读提交)
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据
解决了更新丢失和脏读问题

第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的
解决了更新丢失、脏读、不可重复读、但是还会出现幻读

第四种隔离级别:Serializable(可序化)
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行
解决了更新丢失、脏读、不可重复读、幻读(虚读)

2)事务的超时时间:表示一个方法最长的执行时间,如果方法执行时超过了时间,事务就回滚。

3)事务的传播行为:控制业务方法是不是有事务的,是什么样的事务的。
支持当前事务的情况:(常用)

TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

不支持当前事务的情况:

TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。

其他情况:

TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

3)事务提交事务,回滚事务的时机
1.当你的业务方法,执行成功。没有异常抛出,当方法执行完毕,spring在方法执行后揭交事务。事务管理器commit
2.当你的业务方法抛出运行时异常或ERROR, spring执行回滚,调用事务管理器的rollback

运行时异常的定义:RuntimeException和他的子类都是运行时异常,例如NullPointException,NumberFommatException

3)当你的业务方法抛出非运行时异常,主要是受查异常时,提交事务

总结spring的事务

1.管理事务的是事务管理和他的实现类
2.spring的事务是一个统一模型
1)指定要使用的事务管理器实现类,使用<bean>
2)指定哪些类,哪些方法需要加入事务的功能
3)指定方法需要的隔离级别,传播行为,超时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值