我是靠谱客的博主 勤奋飞鸟,最近开发中收集的这篇文章主要介绍mysql触发器与事务_Mysql触发器与事务,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一:触发器(只有insert,delete,update才有触发器,没有select触发器)

今天碰到mysql的insert触发器的时候,发现其实不管是前置触发器还是后置触发器得出的结果都是一样的,这样的话干嘛还要分前置和后置呢?后来终于明白了,从语法上来讲,两者结果确实是一样的,但是重点就在于需要看使用场合!单纯的抠语法的话,会使自己陷入死胡同当中。

例如:有一个学生表和一个班级表,学生表中有班级表的外键,这样在删除班级表之前,如果班级表在学生表中存有外键的话那么就需要先把学生表中的外键删除才能够删除班级表,这就一定得需要前置触发器了!

633b5b7855998b2937a94fb80936dbb2.png

aa3fbaace469c8a90f492a8a7a7d32ff.png

CREATE TRIGGER before_del_t_class

BEFORE DELETE ON t_class

FOR EACH ROW

DELETE FROM t_student WHERE classid = old.classid;

DELETE FROM t_class WHERE classid = 1;

二:事务

1:是编程中最小的执行单元,它的代码要么全部成功,要么全部失败,不能部分成功,部分失败

2.例子:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.sql.Savepoint;

public class Test1 {

public static void main(String[] args) {

Connection conn = null;

Savepoint sp = null;

try {

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");

conn.setAutoCommit(false);        //写事务的开始,相当于START TRANSACTION

String sql1 = "INSERT INTO t_prod(prodname,price) VALUES('乌龟',52.6)";

String sql2 = "INSERT INTO t_prod(prodname,price) VALUES('王八',33.5)";

PreparedStatement stat = conn.prepareStatement(sql1);

stat.executeUpdate();

//设置保留点,可以将这个保留点之前的部分先提交,等一下rollback的时候可以直接回到这个保留点,不用从头再来,可以没有保留点

sp = conn.setSavepoint();

stat = conn.prepareStatement(sql2);

stat.executeUpdate();

conn.commit();                    //执行完SQL语句之后记得要提交才可以

} catch (Exception e) {

e.printStackTrace();

try {

//当事务出现异常时(比如只有部分的squall语句能够执行),则需要回滚到指定的保留点,如果没有保留点的话,则会回滚到最开头

conn.rollback(sp);

conn.commit();                //在JDBC中回滚完之后还得提交才可以

} catch (SQLException e1) {

e1.printStackTrace();

}

}

}

}

最后

以上就是勤奋飞鸟为你收集整理的mysql触发器与事务_Mysql触发器与事务的全部内容,希望文章能够帮你解决mysql触发器与事务_Mysql触发器与事务所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部