基本介绍
就是处理在mysql的事务
复习一下:事务是一组sql语句需要开启和提交,事务中的sql语句要么全部生效,要么全部不生效,提交之后就是全部生效,中间可以设置保存点,回退到保存点,或直接回退到最开始事务的状态
由事务还引出我们mysql的隔离级别来着
1.默认不开启事务,你执行语句就是自动提交,不能回滚
2.使用事务的特性
3.利用Connection的setAutoCommit(false)就会取消自动提交
4.commit()提交和sql相同
5.rollback()可以加参数或不加,加的话就是我们保存点的名称
不加就是回滚到最开始
模拟应用
搞个转账这种
如果你不使用事务,可能出现update出现异常,第一个用户少了钱,而第二个用户没有多钱
这种开发后,多线程高并发你指不定哪个就报异常了
所以用事务解决
package yuan.hsp.JDBC;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import yuan.hsp.JDBC.jdbcutils.JDBCUtils;
public class 事务处理 {
public static void main(String[] args) throws SQLException {
Connection connection = JDBCUtils.getConnection();
connection.setAutoCommit(false);//是连接设置!,连接创建所有Statement都不会自动提交
String sql="update account set money = money-100 where id=1";
String sql2="update account set money = money+100 where id=100";
PreparedStatement prepareStatement = connection.prepareStatement(sql);
prepareStatement.executeUpdate();//这个加不加update都是运行和他绑定的语句
//返回结构不同这个是int(行数)不加的话就是boolean
prepareStatement.execute(sql2);//!preparedStatement可以多次执行不需要?赋值的
//如果执行?赋值的只能执行一次
connection.commit();//一定要提交!
JDBCUtils.close(null, prepareStatement, connection);
}
}
注意:1.事务针对连接2.preparedStatement可以执行多句不需要?赋值的,如果需要多次执行?赋值,只能多建几个preparedStatement!!!,默认execute就是执行绑定的那句,后面参数是字符串的话就是执行对应字符串
其实上面那个代码也不是特别好
正常写
try{转账语句}
catch{回滚语句,打印异常语句(输出转账失败什么的)}