在Java代码中要使事务生效,必须手动添加@Transaction 使事务开启,不然事务是没有开启的,单纯的执行一条获取读锁/写锁的SQL语句是没有意义的,执行完毕锁就会被释放掉.
隔离级别
- READ UNCOMMIT(未提交读)
- READ COMMITED(读已提交) 能够读取到已经提交的事务作出的修改. 不能重复读
- REPEATABLE READ(可重复读)
- SERILIZABLE(串行读取)
事务
MySQL 默认采用自动提交模式(AUTOCOMMIT) , 如果不显示的开启一个事务,则每次SQL操作都会被当成一个事务执行提交操作。在当前链接中,可以通过设置AUTOCOMMIT变量来启用/禁用自动提交模式。
mysql> show variables like 'AUTOCOMMIT';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
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阶段锁定协议,在事务的执行过程中,随时可以执行锁定,锁只有在 commit
和 rollback
时进行释放,上边描述的是隐式加锁,InnoDB会根据隔离级别在需要的时候进行加锁。
也支持通过特定语句进行显式锁定
- SELECT …. LOCK IN SHARE MODE 获取读锁
- SELECT …. FOR UPDATE 获取排他锁.
并发更新
- 查询数据
- 数据处理
- 处理完毕的数据更新回表 (如果没有处理好并发更新,那么就会给业务上造成损失.)
这里可以使用乐观锁对数据的更新回表进行处理,保证数据只被处理一次.