java事务例子

事务

张三(1000)和麻子(1000)要转钱

张三向李四转钱100

张三的钱数-100  900

麻子的钱+100 1100

再转钱的过程中张三的钱减少 恰巧这个时候停电,程序出现了异常,导致张三的钱减少,但是麻子没有增多,这样的问题 就是事务安全问题

 

一致性:张三和麻子的钱数总数保持不变

 

原子性:张三的钱减少和李四的钱增多 要用时进行

持久性:  最终这些数据的改变要保存在数据库中     

 

事务线程

1. 脏读数据

张三从麻子 买东西

 

事务一:张三给麻子转账  转账成功

事务二:麻子查看账户,钱多了 他就发货了,提交了事务

事务一:回滚

2. 不可重复读

酒店前台 2个前台 AB

来了一个客人 这个客人想住1101 号房间  前台A

来了另一个客人 这个客人找的是 前台B B1101号房间给了这个客人

3. 幻读(虚读)

对一个订单表查询两次,另外一个事物已经添加了新的记录 之前查的是100条,现在发现是101

 

为了解决上述问题:提出一个隔离性:

1.

想要完全解决上述问题,一个方法串行化(死锁),但是这种东西不推荐使用。使用效率太低

2. 可重复读(MySQL数据库默认的隔离级别)

可以防止脏读和不可重复读,不能防止幻读

3. 读已提交数据(oracle默认的隔离级别)

可以防止脏读数据,不可以防止不可重复读和幻读

4. 读未提交数据

 所有问题都不解决 这种情况是所有隔离性中 性能最好的

 

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个Java事务的完整例子: ```java import java.sql.*; public class TransactionExample { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; static final String USER = "username"; static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, USER, PASS); conn.setAutoCommit(false); stmt = conn.createStatement(); String sql1 = "UPDATE Employees SET age = age + 1 WHERE id = 1"; stmt.executeUpdate(sql1); String sql2 = "UPDATE Employees SET age = age - 1 WHERE id = 2"; stmt.executeUpdate(sql2); conn.commit(); System.out.println("Transaction completed successfully."); } catch (SQLException se) { try { if (conn != null) { conn.rollback(); } } catch (SQLException e) { e.printStackTrace(); } se.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (stmt != null) { stmt.close(); } } catch (SQLException se2) { } try { if (conn != null) { conn.close(); } } catch (SQLException se) { se.printStackTrace(); } } } } ``` 在这个例子中,我们使用了MySQL数据库,并且在程序中使用了两个更新语句。这些更新语句被包含在一个事务中,通过设置 `conn.setAutoCommit(false)` 禁止了自动提交,因此这些语句只有在 `conn.commit()` 被调用之后才会生效。 如果在执行这些更新语句的过程中发生了异常,那么我们会在 `catch` 块中捕获这个异常,并且通过调用 `conn.rollback()` 将事务回滚到之前的状态。如果所有操作执行成功,那么我们就可以通过调用 `conn.commit()` 来提交事务并完成整个操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值