Transactional详细信息
Transactional能入的值
- isolation:事务的隔离级别
- propagation:事务的传播行为
- noRollbackFor:哪些异常事务可以不回滚(输入类型)
- noRollbackForClassName:哪些异常事务可以不回滚(输入全类名)
- rollbackFor:哪些异常事务需要回滚(输入类型)
- rollbackForClassName:哪些异常事务需要回滚(输入全类名)
- readOnly:设置事务只读 (默认为false)这个属性只能够使用在查询sql中。
- timeout:事务超出指定时间后进行回滚(以秒为单位)
此文章就展示项目架构了项目架构请看此文章
案例
timeout 案例
错误提示
readOnly 案例
错误提示
PreparedStatementCallback; SQL [update balance set price = price - ? where name= ?]; Connection is read-only. Queries leading to data modification are not allowed; nested exception is java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
连接是只读的,不允许导致数据修改的查询(修改语句不容许设置为只读)
noRollbackFor 案例
异常分为运行时异常(非检查时异常)和编译时异常(检查时异常)
spring事务中默认行为为运行时异常回滚,编译时异常不回滚
原数据
运行时异常
数据
编译时异常
数据并没有回滚,证明spring事务中默认编译期事务不回滚
设置算术异常不回滚
数据
发现数据并没有回滚 ,zs 已经扣钱了 ,ls没有加到钱
rollbackFor案例
数据还是不变
注意点:rollbackFor设置异常回滚的时候 ,异常不要try - catch掉, try - catch掉的异常事务还是不会进行回滚操作。
isolation
具体的数据库隔离级别请看此文章 隔离级别连接
设置隔离级别
四种取值
DEFAULT:默认 和当前数据库有关,Oracle默认读已提交,MySQL默认可重复读。
READ_COMMITTED:读已提交
READ_UNCOMMITTED:读未提交
REPEATABLE_READ:可重复读
SERIALIZABLE:串行化
propagation
propagation 事务的传播行为 ,什么是事务的传播行为 ,比如有一个方法a,方法a调用了方法b,其中方法a自己有事务控制,而方法b也有自己的事务,那么方法b使用的事务是谁的,是自己本身,还是a方法的事务,这就是事务的传播行为。
spring提供了七种事务的传播行为
-
MANDATORY:当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常
-
NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在它自己的事务内运行
-
NEVER:当前的方法不应该运行在事务中。如果有运行的事务,就抛出异常
-
NOT_SUPPORTED:当前的方法不应该运行在事务中。 如果有运行的事务,将它挂起
-
REQUIRED:如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
-
REQUIRES_NEW:当前的方法必须启动新事务,并在它自己的事务内运行.如果有事务正在运行,应该将它挂起
-
SUPPORTS:如果有事务在运行当前的方法就在这个事务内运行,否则它可以不运行在事务中.