spring声明式事务流程
导入ioc的jar包(依赖包),就是(实例化bean的jar包 ioc容器)
导入junit jar包,就是测试类的包用于用@Test
导入druid jar包,创建链接池,每次可以创建一批链接,节省了每次创建一个链接每次开启链接,关闭链接
导入mysql jar包,为了链接数据库
导入aop jar包
导入jdbc和事务的jar包
在spring.xml里面创建扫描包用于spring注解的使用,先引入外部属性资源文件(db.properties)用于配置第三方bean,第三方bean用于配置jdbc的Bean组件,把第三方bean里的id吸入到jdbc里的ref里
db.properties,第一句是用户名第二句是密码,第三句是要引入的数据库,第四句是数据库的驱动
在测试类里用@before注解的时候,有两种@before,第一种@before是junit的,第二种是切面的也就是aop的@before,我们用第一种的,@before的作用是每次记载@Test注解下面的方法时都会加载@before里面的内容
在测试类里测试下数据库是否成功连接了
(查询)用jdbc来获取数据库中的数据有多少条,Long.class意思是用long类型接受,最后输出
数据库内容
(查询)第一种获取数据对象的方法当数据库的字段名和java类属性名的字段名一样时,如下面三张图的写法
(查询)当属性名和数据库的名不一致的时候我们用下面这种写法其中绿色字体的是数据库中的名字
(查询)用list查询要把queryForObject改成query
(增加)下面是增加的写入方法
(修改)修改的写法
(删除)删除的写法
在spring.xml里面写入以具名参数的写入方式
以删除举例子如下图
下面是用三层书写jdbc代码首先声明jdbc类请两句固定写法
事务的特性:ACID
在AOP中生成增强类(就是上篇文章切面那个),在spring.xml里面配置事务管理器,基于注解的写法
下面两张图是数据访问层的数据
下面是服务层的,服务层先实现存钱和扣钱的方法,然后通过转账方法调用(在没使用事务注解的情况)
会报错而且执行的错误数据还会传入到数据库
加上@Transactional注解后虽然代码会报错但是错误数据不会传入到数据库里了
@Transactional注解应该写在哪如下图解释
并发事务会出现的几种问题
1.脏读
2.不可重复度
3.幻影读
对问题的应用场景,并发安全比较,运行效率
当出现事务注解在一个类里多个方法中用时我们应该遵循什么原则呢
下图是遵循原则的图表
第一种(REQUIRED)在用事务传播行为类型的REQUIRED的时候如下图,在测试类里没有用@Transactional,转账放方法会自动开启一个事物,里面的的sub(),save(),不管有没有事务都用于事务的特性就是有@Transactional注解(适用增删改查)
第二种(SUPPORTS),意思是测试类里没有用到@Transactional注解,但是在测试类里调用了query方法不开启事务,但是如果把query方法放入到sub方法里sub方法有@Transactional就优先遵循@Transactional注解
第三种方法(REQUIRES_NEW),首先要用此注解需要先创建一个类,然后把要写的事务方法写到新类里
作用是假如写入log是扣钱事务的话,即使save存钱方法失败了,也还是会扣钱的,他是一个单独的事务和sub方法和save方法不在一个事务当中(有挂起事务的都需要重新创建一个类在写方法)
请求超时的写法用timout=2意思是设置请求时间是2秒如果过了两秒就报请求超时的错误
下面是基于xml的配置事务的方式
当注解方式和xml配置方式同时存在时会以注解优先
expression为要用在那个包上,name为用在此包下方面名开头为下面图中的内容,read-only为是否采用优化的只读事务
1.spring事务的实现方法和实现原理
上面全文解释