在Java代码中要使事务生效,必须手动添加@Transaction 使事务开启,不然事务是没有开启的,单纯的执行一条获取读锁/写锁的SQL语句是没有意义的,执行完毕锁就会被释放掉.

隔离级别

  • READ UNCOMMIT(未提交读)
  • READ COMMITED(读已提交) 能够读取到已经提交的事务作出的修改. 不能重复读
  • REPEATABLE READ(可重复读)
  • SERILIZABLE(串行读取)

事务

MySQL 默认采用自动提交模式(AUTOCOMMIT) , 如果不显示的开启一个事务,则每次SQL操作都会被当成一个事务执行提交操作。在当前链接中,可以通过设置AUTOCOMMIT变量来启用/禁用自动提交模式。

  1. mysql> show variables like 'AUTOCOMMIT';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | autocommit | ON |
  6. +---------------+-------+
  7. 1 row in set (0.00 sec)

1或者N表示启用,0或者OFF表示关闭。当 AUTOCOMMIT=0时,所有的SQL操作都在一个事务中,直到显示的执行 commit 提交或者是 rollback 回滚

MySQL中通过 set session transaction isolation level read commited 来修改当前链接的 隔离级别

隐式和显式锁定

InnoDB采用的是2阶段锁定协议,在事务的执行过程中,随时可以执行锁定,锁只有在 commitrollback 时进行释放,上边描述的是隐式加锁,InnoDB会根据隔离级别在需要的时候进行加锁。

也支持通过特定语句进行显式锁定

  • SELECT …. LOCK IN SHARE MODE 获取读锁
  • SELECT …. FOR UPDATE 获取排他锁.

并发更新

  • 查询数据
  • 数据处理
  • 处理完毕的数据更新回表 (如果没有处理好并发更新,那么就会给业务上造成损失.)

这里可以使用乐观锁对数据的更新回表进行处理,保证数据只被处理一次.