java监听mysql事务_Java数据库处理与事务机制

本文介绍了Java如何连接MySQL数据库,执行SQL语句,以及详细讲解了Java事务处理的两种方式——JDBC事务和JTA事务,包括它们的工作原理、优缺点及示例代码。
摘要由CSDN通过智能技术生成

数据库连接

数据库连接步骤如下:

下载mysql-connector-java的jar包,并导入

加载注册驱动程序,Class.forName(“com.mysql.jdbc.Driver”)

连接数据库

conn = DriverManager.getCOnnection(DB_URL,USER,PASS)

执行sql语句

//创建用于执行sql语句的Statement对象

stmt = (Stattement)conn.createStatement();

//执行查询语句,返回查询结果

ResultSet rs = stmt.executeQuery(“SELECT id,name FROM test”);

while(rs.next()){

int id = rs.getInt("id");

String name = rs.getString("name");

out.println("..."+id+"..."+name);

out.println("
")

}

//执行插入语句,返回插入行数

String 失去了= “INSERT INTO test …VALUES(…)”

stmt = (Statement)conn.create.Statement();

int count = stmt.executeUpdate(sql);

//数据库更新(删除)和插入相似

关闭数据库连接

rs.close();

stmt.close();

conn.close();

PrepareStatement

是Statement的子接口,可以传入带占位符的sqlyuju,提供补充占位符变量的方法

String sql = “insert into mysql_test values(?,?,?)”

PrepareStatement ps = conn.preprareStatement(sql);

ps.setString(1, ‘’);

ps.setString(2, ‘’);

ps.setString(3, ‘’);

ps.execteUpdate();

Java事务处理

何为事物: 所有的操作要么同时完成,要么同时失败。在mysql中提供Commit和Rollback命令进行事务的提交与回滚。

java的事务处理类型有三种,JDBC、JTA(Java Transaction API)事务、容器事务。容器事务多用于Spring中。

JDBC事务处理机制

JDBC一切行为包括事务是基于一个connection的.

JDBC事务处理步骤:

取消JDBC的自动提交

void setAutoCommit(bollean autoCommit)=>setAutoCommit(false)

执行各个sql语句,加入到批处理之中

如若所有语句都执行成功,则提交事务commit(),如果出现错误,则回滚:roolback()

基本核心如下:

//取消自动提交

conn.setAutoCommit(false)

//将sql加入到批处理

stmt.addBatch();

stmt.addBatch();

//执行批处理操作

stmt.execteBatch();

//提交事务

commit();

//发生错误

try{

rollback();

}

优缺点:

可以将多个sql语句放到同一个事务中,保证ACID特性,API比较简单,性能好

局限是:一个JDBC事务不能跨多个数据库

实例如下所示:

public static void example(){

Connection conn = null;

}try{

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

conn = DreiverManager.getConnection("jdbc:ysql://localhost:3306/mysqltest", USSR, PASS);

conn.setAutoCommit(false);//取消自动提交,改为手动提交

String sql_1 = "update test_table set name='...' where name='...'";

String sql_2 = "insert test_table (name,url) values('...',''),('','')";

stmt = (Statement)conn.create.Statement();

int count = stmt.executeUpdate(sql_1);

//若所有结果执行完成,则执行提交事务

stmt.execteUpdate(sql_2);

conn.commit();

ps.close();

conn.close()

catch(ClassNotFoundException e){

e.printStackTrace();

}catch(SQLException e){

e.printStackTrace();

try{

//只要有一个sql语句错误,则事务回滚

conn.rollback();

}catch(SQLException e){

e.printStackTrace();

}

}

}

JTA事务处理

JDBC事务无法满足分布式数据库的处理,所以使用JTA,JTA是一个java企业版的应用程序接口,在java中,允许完成跨越多个XA资源的分布式事务

XA(数据库与事务管理器的接口标准,Oracle,DB2,Sybase提供XA支持)

JTA提供了java.transaction.UserTansaction,主要方法为:

begin:开启一个事务

commit:提交当前事务

rollback:回滚当前事务

setRollbackOnly:把当前事务标记为回滚

setTransactionTimeout:设置事务的事件,就是抛出异常,回滚事务

要想使用用 JTA 事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。XAConnection 是参与 JTA 事务的 JDBC 连接。

要使用JTA事务,必须使用XADataSource来产生数据库连接,产生的连接为一个XA连接。

XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection)连接的区别在于:XA可以参与JTA的事务,而且不支持自动提交。

public void JtaTransfer() {

javax.transaction.UserTransaction tx = null;

java.sql.Connection conn = null;

try{

tx = (javax.transaction.UserTransaction) context.lookup("java:comp/UserTransaction");  //取得JTA事务,本例中是由Jboss容器管理

javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup("java:/XAOracleDS");  //取得数据库连接池,必须有支持XA的数据库、驱动程序

tx.begin();

conn = ds.getConnection();

// 将自动提交设置为 false,

//若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交

conn.setAutoCommit(false);

stmt = conn.createStatement();

// 将 A 账户中的金额减少 500

stmt.execute("\

update t_account set amount = amount - 500 where account_id = 'A'");

// 将 B 账户中的金额增加 500

stmt.execute("\

update t_account set amount = amount + 500 where account_id = 'B'");

// 提交事务

tx.commit();

// 事务提交:转账的两步操作同时成功

} catch(SQLException sqle){

try{

// 发生异常,回滚在本事务中的操做

tx.rollback();

// 事务回滚:转账的两步操作完全撤销

stmt.close();

conn.close();

}catch(Exception ignore){

}

sqle.printStackTrace();

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值