JDBC中的事务操作

                    JDBC中事务的操作


 

 

  所谓的事务,就是我们在做一些事情的时候,要么同时成功,要么同时失败。这就是事务。

可以举一个简单的例子。比如说,我们在ATM中存钱的时候,如果我们存钱成功了。那么在银行系统的日志Log中就会打印存钱成功的消息。但是,如果我们存钱失败了得话,那么

银行系统的日志Log中就会打印存钱不成功的消息,或者不打印消息。也就是说,这俩者是同时成功或者说是同时失败的。不会出现一方成功但是另外一方失败的情况。


 

事务起始于DML语句。比如说是INSERT,UPDATE,或者说是DELETE语句。也就是说,如果有一组的SQL语句。那么当遇到这些类型的SQL语句的时候,那么事务就会开始执行了。这就是事务的开始。

那么事务什么时候结束呢?我们来看一下最后的一种情况。比如说,我们有一组SQL语句。并且事务开始了。如果在这一组的SQL语句中,有一条的SQL语句失败了。那么就会roolBack.也就是说,所有的SQL语句都没有执行成功,回到原来的状态。


   

   

 

 

我们来看一下事务的四大特征。一个原子性:也就是所有的事务中的SQL语句,要么同时

成功,要么同时失败。这就是原子性。

  一致性:如果事务内有一个操作失败了,那么在事务中所有已经更改过的数据全部都回到 修改以前的状态。

 隔离性:是指对于一个表,如果有A事务和B事务地对它进行修改。那么事务不会查看中间的状态。

 持久性:也就是说,事务完成了以后,它对于系统的影响是永久性的。


 

 

事务的级别:所谓的读取未提交:是指一个事务在还没有commit的时候,另外的一个事务

就可以看到状态。

 读取已提交:是指一个事务在已经ccommit的时候,另外的一个事务才能够看到修改后的状态。系统一般默认的也是这种状态。

 序列化:其实也就是对事务进行加锁。

从上往下,效率越来越低。

最后我们来看一些例子:

package com.bjsxt.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;

 

 

/**

 * 测试事务的基本概念和用法

 * @author 高淇 www.sxt.cn

 *

 */

public class Demo06 {

public static void main(String[] args) {

Connection conn = null;

PreparedStatement ps1 = null;

PreparedStatement ps2 = null;

try {

//加载驱动类

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

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

conn.setAutoCommit(false); //JDBC中默认是true,自动提交事务

ps1 = conn.prepareStatement("insert into t_user (username,pwd) values (?,?)");

ps1.setObject(1, "高淇");

ps1.setObject(2, "123456");

ps1.execute();

System.out.println("插入一个用户,高淇");

try {

Thread.sleep(6000);

} catch (InterruptedException e) {

e.printStackTrace();

}

/*在这里的话,("insert into t_user (username,pwd) values (?,?,?)")

这条SQL语句是有错误的。应该只有俩个?。那么由于这些SQL语句都是处于一个事务

中的。那么因为这个SQL语句是有错误的。那么就相当于事务中的所有的SQL语句都没有执行。所有数据库的表中是没有任何变化的。这是要注意的。*/

ps2 = conn.prepareStatement("insert into t_user (username,pwd) values (?,?,?)");

ps2.setObject(1, "马士兵");

ps2.setObject(2, "123456");

ps2.execute();

System.out.println("插入一个用户,马士兵");

conn.commit();

} catch (ClassNotFoundException e) {

e.printStackTrace();

try {

conn.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(conn!=null){

conn.close();

}

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱coding的同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值