MySQL 5.x的InnoDB事务处理:原子性、一致性和隔离性详解

需积分: 9 5 下载量 117 浏览量 更新于2024-09-17 收藏 39KB DOC 举报
MySQL与事务 在MySQL 5.X及更高版本中,尽管初期有些人可能误以为MySQL不支持事务处理,但随着版本的更新,特别是引入了BDB和InnoDB存储引擎,MySQL已经具备了强大的事务管理能力。InnoDB存储引擎因其性能和稳定性,在实际应用中尤为常见,尽管其间曾发生Oracle收购InnoDB的事件,但这不影响其在MySQL中的核心地位。 事务是数据库操作的基本单位,确保数据的一致性和可靠性。在MySQL中,事务遵循ACID属性,即: 1. **原子性(Atomicity)**:事务中的所有操作作为一个不可分割的单元执行,要么全部成功,要么全部回滚。例如,银行转账时,同时从一个账户扣款并增加另一个账户,两者必须同时完成,否则交易无效。 2. **一致性(Consistency)**:事务前后,数据库状态保持一致。如转账过程中,如果转账成功,则两个账户余额相应减少;如果失败,两账户余额不变。 3. **隔离性(Isolation)**:一个事务对其他事务是独立的,不会看到未提交的事务。在网购物品场景中,两个并发用户尝试购买同一本书,只有在前一个事务提交后,第二个用户才能看到剩余库存为零,从而避免并发问题。 4. **持久性(Durability)**:一旦事务被提交,其结果将永久保存,即使系统出现故障也能保证数据完整性。如转账后,账户余额的变化应被持久化,即使系统崩溃也不受影响。 对于网上购书的例子,数据表可能如下定义: ```sql CREATE TABLE book ( book_id UNSIGNED INT(10) NOT NULL AUTO_INCREMENT, book_name VARCHAR(255) NOT NULL, stock INT(10) DEFAULT 0 NOT NULL, PRIMARY KEY (book_id) ); ``` 当两个用户并发购买同一本书时,需要使用事务来确保库存的准确性。首先,检查库存,然后更新库存并提交事务。如果其中一个事务在更新库存前被中断,库存将恢复到原始值,保持数据的一致性。因此,事务处理在保证数据操作的正确性和并发控制方面至关重要,尤其在高并发场景下,如在线商店或金融系统中。
2013-06-13 上传
关于mysql的事务处理 public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System.out.println("事务处理开始!"); con.setAutoCommit(false); // 设置连接不自动提交,即用该连接进行的操作都不更新到数据库 sm = con.createStatement(); // 创建Statement对象 //依次执行传入的SQL语句 for (int i = 0; i < sqls.length; i++) { sm.execute(sqls[i]);// 执行添加事物的语句 } System.out.println("提交事务处理!"); con.commit(); // 提交给数据库处理 System.out.println("事务处理结束!"); // 事务结束 //捕获执行SQL语句组中的异常 } catch (SQLException e) { try { System.out.println("事务执行失败,进行回滚!\n"); con.rollback(); // 若前面某条语句出现异常时,进行回滚,取消前面执行的所有操作 } catch (SQLException e1) { e1.printStackTrace(); } } finally { sm.close(); } } 通常都是上述的写法, 在mysql 不支持事务的时候 , 中间的 setAutoCommit 的事务操作是不是都不生效. 现在innoDB支持 事务了, 上述的 java 代码是否能实现 以下的 事务隔离的 操作, 在修改的时候处于锁定状态 或者 只可以通过存储过程来实现, 单行的锁定 BEGIN; SELECT book_number FROM book WHERE book_id = 123 FOR UPDATE; --这里for update , 以前用Oracle的时候也是有这个行锁 // ... UPDATE book SET book_number = book_number - 1 WHERE book_id = 123; COMMIT;