5.事务

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


/*
 * 事务简单来说就是一组要么同时执行成功要么同时执行失败的SQL语句,是数据库操作的一个执行单元
 * 事务开始于:DML语句,也就是insert,update或着delete这些语句;查询的select不属于事务开始
 * 			 前一个事务结束后,有输入了另一条DML语句
 * 
 * 事务结束于:COMMIT或ROLLBACK语句:提交或回滚到未执行前的状态
 * 			 执行一条DDL语句:例如创建一张表,此时自动提交
 * 			 执行一条DCL语句:权限操作,此时自动提交
 * 			 断开数据库连接
 * 			 执行了一条DML语句,结果语句却失败了
 * 
 * 事务的四大特性:1.原子性(ctomicity):表示一个事务内的所有操作是一个整体,要么全部成功,要么全失败
 * 				 2.一致性(consistency):一个事务内有一个操作失败时,所有的更改过的数据必须回滚到修改前的状态
 * 				 3.隔离性(isolation):事务查看数据时,数据所在的状态要么是另一并发事务修改它之前的状态,
 * 						   			 要么是另一事务修改它之后的状态,事务不会查看中间状态的数据
 * 				 4.持久性(durability):持久性事务完成之后,它对于系统的影响是永久性的
 * 
 * 事务隔离级别从低到高:(效率与隔离级别相反,一般用前两个,默认都用第二个,后两个效率太低了)
 * 						1.读取未提交(2个事务同时进行时,a事务如果处于这个级别,那么a事务还么提交b事务就可以看到),
 * 						2.读取已提交(2个事务同时进行时,a事务如果处于这个级别,那么a事务提交之后b事务才可以看到),
 * 						3.可重复读,
 * 						4.序列化(锁表)
 * 
 */
public class Demo_main {

	public static void main(String[] args){
		PreparedStatement ps1 = null;
		PreparedStatement ps2 = null;
		Connection c = null;
			try {
//加载驱动类
				Class.forName("com.mysql.jdbc.Driver");
//建立连接
				c = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc的使用","root","root");
			//关闭自动提交
				c.setAutoCommit(false);//JDBC默认自动提交				
//执行SQL语句					
				
				ps1 = c.prepareStatement("insert into student(name,age) values(?,?)");
				ps1.setObject(1, "张三");
				ps1.setObject(2, 18);
				ps1.execute();
				System.out.println("正确的数据");
				
				try {
					Thread.sleep(6000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				ps2 = c.prepareStatement("insert into student(name,age) values(?,?,?)");
				ps2.setObject(1, "李四");
				ps2.setObject(2, 19);
				ps2.execute();
				System.out.println("错误的数据");
			//手动提交
				c.commit();
//因为第二条语句是错误的,多了一个"?"占位符
//在我们捕获异常后回执行回滚操作,返回事务开始之前,导致第一条正确的语句也会无效			
			
				
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
				try {
					c.rollback();
				} catch (SQLException e1) {
					e1.printStackTrace();
				}//回滚,回滚到该语句未执行前
			} catch (SQLException e) {
				e.printStackTrace();
			}finally {
//关闭
				try {
					if(ps1 != null) {
						ps1.close();
						}
				} catch (SQLException e) {
					e.printStackTrace();
				}
				try {
					if(ps2 != null) {
						ps2.close();
						}
				} catch (SQLException e) {
					e.printStackTrace();
				}
				try {
					if(c != null) {
						c.close();						
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值