msql,触发器无事物回滚,插入之前满足条件再插入

很少写mysql的触发器和存储过程,由于需要需要做一个很小的判断,要用到触发器,要达到的效果就是,插入之前判断是否满足条件如果不满足就不插入

如果用sqlserver 或者orcale 就很简单,按sqlserver 和orcale的思路去找事物回滚,或者抛异常,都没用,最后只有不断查资料不断尝试,只有用mysql的触发器机制,触发器中无法修改,删除原表的值,也无法有返回值

最后代码如下

CREATE
TRIGGER `duanxin_before_insert` BEFORE INSERT ON `t_duanxin`
FOR EACH ROW BEGIN
DECLARE msgcount INT(10);
SET msgcount=(SELECT COUNT(*) FROM t_duanxin WHERE FIND_IN_SET(new.to_phone, to_phone) AND new.content=content);
  IF msgcount>0 THEN
  DELETE FROM t_duanxin WHERE id=new.id;
  END IF;

END;

加粗部分是条件判断不满足就执行删除操作,执行删除就会报错就不会插入数据

感觉这中方式有搓,就好比在代码中手动抛出异常一样,一点都不友好.不过没办法暂时只有这种实现方式了

时间: 2024-10-06 15:29:58

msql,触发器无事物回滚,插入之前满足条件再插入的相关文章

java 手动事物回滚Transaction

1.spring mvc配置异常事物回滚机制 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">        ......(省略)    </bean> <!-- 事务管理器 -->    <bean id=&qu

复习课程jdbc:使用配置文件properties进行连接数据库,数据库存取图片,批处理,时间戳,事物回滚等等

使用配置文件properties进行连接数据库 首先创建一个file自定义文件名,但是后缀名必须改为.properties(不分大小写):如config.properties: 然后双击config.properties进行编辑:此文件数据是根据键值对来存储的:我们可以把连接数据库的一些连接字符串存储在此文件里:然后用的时候直接读配置文件,到时候更换的时候方便移植和修改. name                                                          

mysql的engine不同,导致事物回滚失败的问题

近期在项目上遇到遇到一个头疼的问题,前方销售团队反馈了一个客户那边在创建用户(save object to DB)报错了以后,前台展示了错误,但是数据库却保存了这条记录. 接到这个BUG以后,第一时间查看了事物是否正确回滚,排查了代码后发现事物回滚成功,并且在我的环境下回滚成功,错误没有复现, 这个时候就比较棘手了,客户的事物回滚失败,但是我们的回滚成功,我们的项目使用的是grails框架做的,查询了grails声明性事物回滚的规则,我们的代码没有问题,那我就把问题转移到了数据库身上, 要了客户

spring事物回滚机制 (事务异常回滚,捕获异常不抛出就不会回滚)

当异常被捕获catch的时候,spring的事物则不会回滚 为什么不会滚呢??  spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常: 解决方案: 1.例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在se

C# - 事物回滚

该功能依赖dbhelp.cs 传送门:http://www.cnblogs.com/CyLee/p/5324652.html 起始点 this.DbHelp.BeginTransaction(); 回滚 this.DbHelp.Rollback(); 解除 this.DbHelp.Commit();

thinkphp 事物回滚

1 $m=D('YourModel');//或者是M(); 2 $m2=D('YouModel2'); 3 $m->startTrans();//在第一个模型里启用就可以了,或者第二个也行 4 $result=$m->where('删除条件')->delete(); 5 $result2=$m2->where('删除条件')->delete(); 6 if($result && $result2){ 7 $m->commit();//成功则提交 8 }e

MySQL事物回滚

#commit.rollback用来确保数据库有足够的剩余空间:#commi.rollback只能用于DML操作,即insert.update.delet;#rollback操作撤销上一个commit.rollback之后的事务. create table test( PROD_ID varchar(10) not null, PROD_DESC varchar(25)  null, COST decimal(6,2)  null); #禁止自动提交set autocommit=0; #设置事务

事务回滚后,自增ID仍然增加

回滚后,自增ID仍然增加. 比如当前ID是7,插入一条数据后,又回滚了.然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.因为虽然你之前插入回滚,但是ID还是自增了. 如果你认为自增ID不应该被事务化,那么其他事务不得不等待着,检查自增ID是被使用还是被回滚,这就导致阻塞.比如下面的例子,A表使用自增ID.User 1------------begin transactioninsert into A ...insert into B ...update C ...insert

为什么mysql事务回滚后, 自增ID依然自增

事务回滚后,自增ID仍然增加,回滚后,自增ID仍然增加.比如当前ID是7,插入一条数据后,又回滚了.然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.因为虽然你之前插入回滚,但是ID还是自增了. 如果你认为自增ID不应该被事务化,那么其他事务不得不等待着,检查自增ID是被使用还是被回滚,这就导致阻塞. 比如下面的例子,A表使用自增ID. User 1 ------------ begin transaction insert into A ... insert into B ..