Mysql触发器与事务
一:触发器(只有insert,delete,update才有触发器,没有select触发器)
今天碰到mysql的insert触发器的时候,发现其实不管是前置触发器还是后置触发器得出的结果都是一样的,这样的话干嘛还要分前置和后置呢?后来终于明白了,从语法上来讲,两者结果确实是一样的,但是重点就在于需要看使用场合!单纯的抠语法的话,会使自己陷入死胡同当中。
例如:有一个学生表和一个班级表,学生表中有班级表的外键,这样在删除班级表之前,如果班级表在学生表中存有外键的话那么就需要先把学生表中的外键删除才能够删除班级表,这就一定得需要前置触发器了!
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();
}
}
}
}