多语句事务操作

  要求: 向数据库中插入两条SQL, 要求一条失败, 事务回滚.
  环境: spring boot
  方法一 : 第一个想到spring的事务机制 -----  @Transactional , 使用之前需要对transactionManager进行配置, 我这边是配置在dataSource的文件, applicationContext.xml文件中 , 引入注解是事务, ①在配置文件中引入<tx:>命名空间

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"

②声明使用注解式事务

<tx:annotation-driven transaction-manager="transactionManager" />

③在需要事务支持的方法上注明@Transactional

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, timeout = 3)
    public void updateBrandInfo(OuterBrandInfo OuterBrandInfo) {
        OuterBrandInfo outer = new OuterBrandInfo();
        outer.setBrandId("0001212");outer.setOuterOrderType(2);outer.setBrandName("养乐多");
        outerBrandInfoMapper.updateByPrimaryKey(outer);//更新操作
        outerBrandInfoMapper.insert(OuterBrandInfo);//插入操作 , 设置的主键重复, 插入失败 , 更新操作会进行回滚 , 更新失败
    }

测试结果:
1.使用事务支持,   执行过程中抛出重复主键异常org.springframework.dao.DuplicateKeyException, 跟新失败, 看出数据库未改变

2.不使用事务支持,  去掉@Transactional 事务

 执行时,抛出相同异常, 但是更新成功 .


综上, 使用此方法可以以事务方式同时操作两条sql.

  方法二 :  应用场景是,  操作一条数据,  if 存在,  update ;  else insert

  第一个想法是,使用事务操作呀, 先进行查询,有就更新,没有添加. 然而貌似不能解决,两条线程操作 ----  第二条用户添加的动作,发生在第一条的查询之后,添加之前; 会导致第一条直接添加失败. 此情况就是相当于多个用户同时再插入同一条数据了嘛, try catch 处理吧.

  那是不是就需要进行两步操作了, 查询 --- 判断 --- 添加/update.   使用的mysql数据库, insert into ... ON DUPLICATE KEY 可以来帮忙 ,

eg.

insert into t_duplicate values (1,3,4),(2,2,2),(3,3,2) on DUPLICATE key update b =values(b),c=values(c);

插入多条数据 , if主键重复, update  b = xxxx,  c=xxxxx,  只会更新配置在update后的列

时间: 2024-10-12 08:14:46

多语句事务操作的相关文章

SpringBoot JPA实现增删改查、分页、排序、事务操作等功能

今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查.分页.排序.事务操作等功能.下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex): public List<User> findByHeightAndSex(int height,char sex); // Or --- 等价于 SQL 中的 or 关键字,比如 findByHeig

MySql的事务操作与示例

事务就是一个逻辑工作单元的一系列步骤.事务是用来保证数据操作的安全性 事务的特征: Atomicity(原子性) Consistency(稳定性,一致性) Isolation(隔离性) Durability(可靠性) [事务只针对对数据数据产生影响的语句有效] show engines  //查看mysql锁支持的数据引擎 MyISAM不支持事物,InnoDB支持事物 默认情况下,MySQL将以自动提交模式运行,这意味着没一条小命令都将当做一个只有一条命令的事物来执行. 如果要让mysql支持支

2.关于QT中数据库操作,简单数据库连接操作,数据库的增删改查,QSqlTableModel和QTableView,事务操作,关于QItemDelegate 代理

 Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法参考博客:http://blog.csdn.net/tototuzuoquan/article/details/39565783 如果行想进数据库开发,需要安装libqt5sql5-mysql.命令是: sudo apt-get install libqt5sql5-mysql 4 创建一个项目 要调用数据库,需要加上QT += gui widgets sql  也就是说要加

如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作

Ibatis是MyBatis的前身,它是一个开源的持久层框架.它的核心是SqlMap--将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开.Ibatis是"半自动化"的ORM持久层框架.这里的"半自动化"是相对Hibernate等提供了全面的数据库封装机制的"全自动化"ORM实现而言的,"全自动"ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行.而Ibatis的着力点,则在于P

如何处理Ibatis结合MySQL数据库使用时的事务操作

Ibatis是MyBatis的前身,它是一个开源的持久层框架.它的核心是SqlMap--将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开.Ibatis是"半自动化"的ORM持久层框架.这里的"半自动化"是相对Hibernate等提供了全面的数据库封装机制的"全自动化"ORM实现而言的,"全自动"ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行.而Ibatis的着力点,则在于P

iOS-FMDB事务操作SQLite数据库

批量操作数据库的时候,我们经常会用到事务处理.事务是访问并可能更新数据库各种数据项的数据单元(unit),是恢复和并发的控制的基本单位. 事务具有四个属性. - 原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. - 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态.一致性与原子性是密切相关的. - 隔离性(isolation):一个事务的执行不能被其他事务干扰.即一个事务内部的操作及使用的数据对并发的

分布式事务操作之Spring+JTA

什么是分布式事务?在网上找了一段比较容易理解的"定义". 分布式事务是指事务的参与者.支持事务的服务器.资源管理器以及事务管理器分别位于分布系统的不同节点之上,在两个或多个网络计算机资源上访问并且更新数据,将两个或多个网络计算机的数据进行的多次操作作为一个整体进行处理.如不同银行账户之间的转账. 对于在项目中接触到JTA,大部分的原因是因为在项目中需要操作多个数据库,同时,可以保证操作的原子性,保证对多个数据库的操作一致性. 在正式的项目中应该用springMVC(struts)+sp

PHP + MySQL事务操作的实际应用代码演示

以下的文章主要向大家描述的是PHP(PHP培训 php教程 ) + MySQL(MySQL认证 Mysql培训 )事务操作的实际应用代码演示,我们大家都知道在实际LAMP的应用中,一般PHP所使用的是AdoDB来对MySQL数据库进行操作,下面给出AdoDB相应的代码方便大家查阅: startTrans(); 实际,getOne所调用的查询也可以直接放到rowLock来进行,这里只是为了演示效果能更明显些. $adodb->rowLock('book', 'book_id = 123'); $b

使用事务操作SQLite数据库

使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务.使用例子如下:  SQLiteDatabase db = ....; db.beginTransact