MySQL中的事务

事务: 一大堆事情绑在一起做,全部成功才提交,否则就回滚到提交之前的状态

原子性: 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功要么全部失败回滚.

一致性:数据库总是从一个一致性状态装换到另一个一致性的状态.

隔离性:一个事务所做的修改在提交以前, 对其他事务不可见

持久性:一旦事务提交,则其所做的修改将会永久保存到数据库中

Mysql中事务的隔离级别

  1. 未提交读取 read uncommited

    事务中的修改,即使没有提交,也会被其他事务读取,存在脏读和幻读

  2. 提交读 read commited (大多数数据库默认隔离级别,但MySQL不是)

    只能读到其他事务已经提交的数据,解决了脏读,存在幻读

  3. 可重复读取 repeatable read

    在一个事务中能够保证能够获取到一样的数据,理论上依然无法解决幻读, 但是MySQL通过多版本并发控制解 决了幻读.

  4. 串行化隔离

    所有事务串行,最高隔离级别,性能最差

死锁:
​ 两个或多个事务在同一资源上相互占用,并请求对方占用的资源,从而导致恶性循环.
InnoDB引擎能监测到死锁的循环依赖,并立即返回一个错误, 将持有最少行级排他锁的事务回滚

事务日志:
​ 帮助提高了事务的效率. 存储引擎可以通过事务日志, 在重启时自动恢复崩溃后未写回磁盘的数据.

多版本并发控制(MVCC)

  1. 每行记录后保存两个隐藏列,行的创建时间, 行的过期时间

    a. 只查找版本早于当前事务版本的数据行,确保事务读取到的行在开始前已存在
    b. 行的删除要么未定义, 要么大于当前事务版本号,确保事务读取到的行在 事务开启之前未删除

  2. 快照读和当前读

    在事务中,执行普通的select查询之后,会创建快照,之后执行相同的select语句查询到的都是之前的快照。
    当对数据执行操作时,会执行当前读,获取最新的数据。

  3. 并发更新

    事务A提交前,会一直由排他锁,此时事务B对数据的更新会阻塞,只有事务A提交或回滚之后,事务B才能获得排他锁,进行数据的更新。

关于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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值