JDBC编程的事务处理
admin
2023-06-09 21:43:01
0

一、事务的基本概念

    数据库是一个多用户使用的共享资源。当多个用户并发地存取数据的时候,在数据库中就会产生多个用户同时存取同一数据的情况。若对并发操作不加控制,就可能会产生读取和存储不正确的数据,破坏数据的一致性。

    而事务是并发控制的基本单位。所谓事务,即一个操作序列。这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。比如银行转账工作:从一个账户扣款,并使用另一个账户收款,这两个操作要么都执行,要么都不执行,因此应该把它们看作是一个事务。

    事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据的一致性。

    对于编程人员来说,可以把数据库事务看作是一组sql语句,这组sql语句是一个逻辑工作单元,它们是不可分割的,它们的执行结果应该作为一个整体永久修改一个数据库的内容或者作为一个整体取消对数据库的修改。

    

二、事务的四个基本特征

    1.原子性

    原子性是指事务中包含的操作都被看作是一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。这也意味着事务中的所有元素作为一个整体提交或回滚。事务的所有元素是不可分割的,是一个完整的操作。

    2.一致性

    一致性是指事务开始之前和事务结束以后数据库都处于一致性状态,数据库的完整性约束没有被破坏。

     3.隔离性

    隔离性是指对数据库进行修改的多个事务是彼此隔离的。这说明事务必须是独立的,不应该以任何形式影响其他事务

    4.持久性

    持久性是指事务完成之后对于数据库的影响是永久的,该修改真实地修改了数据库,即使数据库出现故障也会一直保留。


三、与SQL相关的事务语句

    开始事务:BEGIN TRANSACTION

    提交事务:COMMIT TRANSATION

    回滚事务:ROLLBACK TRANSATION    

package com.eduask.jdbc;

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

/*将要测试的逻辑
  保存一个用户Tom的基本信息和Tom的地址信息
  分别通过两个java方法插入到用户表和地址表中 
  在插入地址表的时候人为造成一个异常
  观察结果
 */
public class TransactionTest {
	
	//创建一个getConnection()用来获取数据库的连接
	public static Connection getConnection(){
		Connection conn = null;
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdemo","root","root");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return conn;
	}
	
	public static void insertUserData(Connection conn) throws SQLException{
			String sql = "insert into tbl_user(id,name,password,email) "
					+ "values(10,'Tom','123456','tom@gmail.com')";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向用户插入了 "+ count + " 条记录");
	}
	
	public static void insertAddressData(Connection conn) throws SQLException{
			String sql = "insert into tbl_address(id,city,country,user_id) "
					+ "values(1,'ShangHai','China','10')";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向地址表中插入了 "+ count + " 条记录");
	}
	
	public static void main(String[] args) {
		Connection conn = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(false);
			
			insertUserData(conn);
			insertAddressData(conn);
			
			conn.commit();
		} catch (SQLException e) {
			System.out.println("=========捕获到SQL异常=========");
			
			e.printStackTrace();
			try {
				conn.rollback();//回滚事务,保证数据库数据的一致性
				System.out.println("=========事务回滚成功=========");
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}finally{
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (Exception e3) {
				e3.printStackTrace();
			}
		}
	}
	
	
}












相关内容

热门资讯

吉田茂的这句告诫,值得日本政府... 高市早苗出任首相后,日本修宪动向再度成为舆论焦点。自民党一方面以“安全保障形势发生剧变”为借口,谋求...
人形机器人,要有身份证了! ◎ 科技日报记者 华凌 22日, 全国首个人形机器人全生命周期管理服务平台在北京发布,《人形机器人全...
伊朗现在哭笑不得 感觉伊朗现在正哭笑不得。与美国的谈判在进行中,特朗普也在不断发帖“指导”中,但按照伊朗的说法,美国官...
最新研究:银河系多数岩质行星构... IT之家 5 月 24 日消息,我们对太阳系内的行星已有诸多认知,长期以来,我们都认为银河系其他区域...
灵动岛缩减35% 史上颜值巅峰... PChome 5月23日消息,随着iPhone 18 Pro和iPhone 18 Pro Max的贴...
双方互攻伤亡大,学校被袭引关切... 【环球时报驻俄罗斯特派记者 隋鑫 郑真】俄罗斯国防部24日表示,为回应乌克兰对俄方民用基础设施的恐怖...
神舟二十三号飞船有多项创新 我国2026年度载人发射任务首战告捷——神舟二十三号飞船有多项创新本报记者 刘诗瑶 李君强《人民日报...
人民日报刊文:警惕日本军国主义... 警惕日本军国主义卷土重来(国际论坛)斯特凡·卢比奇《人民日报》(2026年05月25日 第 03 版...
一线调研|从太空到3000米深... 来源:券商中国 当一颗卫星以每秒7公里的速度驶入太空,或者一台机器人潜入3000米深的海底,它们在传...
第8次会师!神舟二十三号航天员... 新华社酒泉5月25日电(记者李国利、高蕊)神舟二十三号航天员乘组25日顺利进驻“天宫”,中国航天员完...