并发操作可能遇到的问题:
1.读到脏数据,脏数据就是读到了别的事务没有提交的数据,
举个例子,A在一个转账事务中,转了100块钱给B,此时B读到了这个转账的数据,然后做了一些操作(发货给A,或者其他的),可是这时候A的事务并没有提交,如果A回滚了事务,那就GG了。这就是脏读了。
2.不可重读读,在一个事务中两次进行读取同一数据,读到的内容不一致(主要是读到了别的事务更改的数据),这个应用场景不多。
3.幻读(虚读),在一个事务中,两次进行读操作,读到的内容不一致(主要是读到了别的事务新增的记录),应用场景不多。
数据库隔离级别:
1.串行化。(对同一条数据的读写是被事务锁定的,每次只能这个事务结束后才能进行下个事务的读写,可能会导致数据库的死锁,而且速度很慢,不推荐)
2.读已提交的数据(读别的事务提交的数据)
3.可重复读(在一个事务中,两次读取到的数据一致)
mysql 查询事务的隔离级别
select @@tx_isolation
也可以在mysql的配置文件中进行配置
#mysql事务隔离级别,读已提交的数据,防止脏读(读取别的事务未提交的数据)
transaction_isolation = READ-COMMITTED
#并发过程中,可重复读,防止脏读和不可重复读(两次读取一致性,在自己的事务过程中,不会读到别的事务提交的事务)
#transaction_isolation = Repeatable-Read
jdbc中查看和修改数据库隔离级别
//查看事务的隔离级别 System.out.println(conn.getTransactionIsolation());;
//设置事务的隔离级别 conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);