JDBC--事务

4.什么是事务?
事务(Transaction),一般是指要做的或所做的事情。
在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
程序执行单元(unit)—数据库操作的一组SQL语句的执行。
1.由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写
2.由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
例如:我们要实现一个银行转账的操作,首先从A账户减掉指定的金额,然后B账户增加指定的金额,此时转账操作结束。上面的操作如果对应成数据库操作,那么就需要执行两条update语句。数据库把这两条update语句的执行就是一个事务。
指访问并可能更新数据库中各种数据项的一组SQL语句的执行单元(unit)。
5.数据库的事务有4大特征【ACID】
A–原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
C–一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
I–隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
D–持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
6.java中事务的隔离级别
在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。
JDBC定义了五种事务隔离级别:
TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读。
TRANSACTION_READ_COMMITTED 禁止脏读,但允许不可重复读和幻读。
TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读,单运行幻读。
TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读。
TRANSACTION_NONE JDBC驱动不支持事务

7.JDBC的事务管理操作
JDBC的事务管理操作需要通过java.sql.Connection接口来设置的。
事务的隔离级别
在这里插入图片描述

设置事务隔离级别的方法
在这里插入图片描述

例如:
Connection接口对象.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Connection接口对象.setTransactionIsolation(8);
设置是否自动提交事务方法【默认JDBC事务是自动提交的】
在这里插入图片描述

Connection接口对象.setAutoCommit(falset) ; 设置为手动提交事务。
事务的提交方法
在这里插入图片描述

事务的回滚方法【异常中执行】
在这里插入图片描述
回滚事务
例如:
create table t_zhanghu(
zhuanghu_id int primary key auto_increment,
zhuanghu_name varchar(20),
zhuanghu_jine int
);
insert into t_zhanghu values(null,‘zhangsan’,10000);
insert into t_zhanghu values(null,‘lisi’,10000);

package com.lx.transactiondemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 数据库连接类
 * @author Administrator
 *
 */
public class DBConnection {
    private  static  final String DRIVER_NAME="com.mysql.jdbc.Driver";
    private  static  final String URL="jdbc:mysql://127.0.0.1:3306/test";
    private  static  final String USERNAME="root";
    private  static  final String PASSWORD="123456";
	//加载数据库驱动
	static {
		try {
			Class.forName(DRIVER_NAME);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 得到数据库连接对象
	 */
	public static  Connection  getConnection() {
		Connection  conn=null;
		try {
			conn=DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
}

package com.lx.transactiondemo;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 转账的业务类
 * @author Administrator
 *
 */
public class ZhuanZhangService {

	public void  zhuanzhang() {
		Connection conn=DBConnection.getConnection();
		PreparedStatement  ps=null;
		try {
		//设置为手动提交事务
		conn.setAutoCommit(false);
		//设置事务隔离级别
		conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
		String sql="update t_zhanghu set zhanghu_jine=? where zhanghu_name=?;";
		ps=conn.prepareStatement(sql);
		ps.setInt(1, 10000-1000);
		ps.setString(2, "zhangsan");
		ps.executeUpdate();
		int a=10/0;
		ps.setInt(1, 10000+1000);
		ps.setString(2, "lisi");
		ps.executeUpdate();
		//提交事务
		conn.commit();
		}catch(Exception e) {
			//回滚事务
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally {
			try {
				ps.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}	
		}
	}
}

package com.lx.transactiondemo;

public class TestMain {

	public static void main(String[] args) {
		new ZhuanZhangService().zhuanzhang();
	}
}

总结:
1.SQL语句执行的connection与事务设置的connection对象要相同。
2.开始事务conn.setAutoCommit(false);
3.设置事务的隔离级别
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
4.提交事务conn.commit();
5.设置事务回滚【异常中进行】conn.rollback();
上面我们所操作的事务管理是编码式事务管理,后面我们在学习Spring框架的时候会学习到声明式事务管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值