尽量不要使用长事务
用于查找持续时间超过 60s 的事务
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
查看事务是否开启
SELECT @@event_scheduler; 或 SHOW PROCESSLIST; 或 SHOW VARIABLES LIKE 'event_scheduler';
开始MySQL事务执行
SET GLOBAL event_scheduler = 1; 或 SET GLOBAL event_scheduler = ON;
开启事务的目的:是为了确保数据的准确性,如果需要同时执行多条SQL语句,则需要放到事务中进行,只要其中有一行执行失败,则事务回滚。如果只是查询操作,不牵扯对数据库内容的更改,不需要开启事务。但是,在Hibernate中个人建议最好也把查询都放在事务中进行,增删改则必须要放到事务进行。
1、事务的特性:原子性、一致性、隔离性、持久性
2、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读
3、事务隔离级别:
读未提交(Read uncommitted)
别人改数据的事务尚未提交,我在我的事务中也能读到。
读提交(Read committed)
别人改数据的事务已经提交,我在我的事务中才能读到。
可重复读(Repeatable read)
别人改数据的事务已经提交,我在我的事务中也不去读
串行化(Serializable 序列化)
我的事务尚未提交,别人就别想改数据。
这4种隔离级别,并行性能依次降低,安全性依次提高
选择数据库,查看当前事务隔离界别
select @@tx_isolation;
设置MySQL事务的隔离级别:
/设置mysql的隔离级别: set session transaction isolation level 设置事务隔离级别
//设置read uncommitted级别:(读未提交)
set session transaction isolation level read uncommitted;
//设置read committed级别:(读提交)
set session transaction isolation level read committed;
//设置repeatable read级别:(可重复读)
set session transaction isolation level repeatable read;
//设置serializable级别:(串行化)
set session transaction isolation level serializable;
隔离级别对应会出现脏读、不可重复读、幻读的情况
4、
脏读:
当数据库中一个事务A正在修改一个数据但是还未提交或者回滚,
另一个事务B 来读取了修改后的内容并且使用了,
之后事务A提交了,此时就引起了脏读。
此情况仅会发生在: 读未提交的的隔离级别.
不可重复读:
在一个事务A中多次操作数据,在事务操作过程中(未最终提交),
事务B也才做了处理,并且该值发生了改变,这时候就会导致A在事务操作
的时候,发现数据与第一次不一样了。 就是不可重复读。
此情况仅会发生在:读未提交、读提交的隔离级别.
幻读:
一个事务按相同的查询条件重新读取以前检索过的数据,
却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。
幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.
一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。