比如转账,要么付账和收账都成功执行,否则都不执行(回滚)。
不同数据库的当问机制不同,需有不同的事务处理的机制、对象和方法。spring提供一种处理事务的统一模型,能使用统一步骤、方式完成多种不同数据库访问技术的事务处理。
spring中提供处理事务的接口和实现类:
例如下例的spring项目:
两个实体类Goods、Sale,Goods表示商品,Sale用户表示交易记录:
两个持久层的接口及其mapper配置文件:
注意:这里的SaleDao接口中的insertSale()方法中有参数Sale的对象sale,在SaleDao的配置文件中写insert语句可以用#{}来指代sale中的属性。
mybatis.xml文件内容:
applicationContext.xml文件内容(注意红线圈出的添加部分):
一个业务层的接口(含有一个客户买商品的方法):
实现接口的类:
含有两个属性saleDao和goodsDao,这里看到直接调用这两个属性的方法对数据库操作可能会产生疑惑,因为按理应该使用xml文件的信息。但其实在main()方法中使用了applicationContext.xml文件的信息,获取了spring容器中的buyService对象(即BuyGoodsServicImpl对象,在该bean对象中通过ref属性给BuyGoodsServicImpl对象中的saleDao和goodsDao,自动获取spring容器中的bean对象赋值,虽然applicationContext.xml文件中没有写关于saleDao和goodsDao的bean标记,但是加了如下标记,该标记自动扫描name为basePackage的property标记的value值所指定的dao包下的xml文件,生成对应的bean对象(对象的id为接口的首字母小写)。
main程序:
上图所示,本地mysql数据库中的goods表(sale表为空,还未有交易):
可以发现,该表中并没有id为1007的商品,所以程序会报错(NullPointerException)终止交易,但是这时在buy()方法里已经向sale表中插入了一项,但这项并无效用需要撤回,这里需要用到spring的事务机制,在buy()前加注解:
这样,当该方法终止时会对本地数据库进行回滚操作,即撤销之前对数据库的操作。



