1,操作背景
当有多个线程并发操作上千条数据的时候,就会出现了以下的问题:
1,数据库连接数的不够,在并发数为50的时候,出现以下问题

1.1,进行解决:
在项目的配置文件applicationContext.xml中进行更改数据库的最大同时连接数和最大连接数:
<property name="maximumConnectionCount" value="200"/>
<property name="minimumConnectionCount" value="2"/>
<property name="simultaneousBuildThrottle" value="150"/>
<property name="prototypeCount" value="5"/>
2,并发同时操作发生数据的更新不一致:
出现了脏读,重复读的问题:多个线程同时读一个数据,当第一个读到数据时操作了并未提交,而第二个操作还是在原来的数据上进行操作的,即:一个事务访问数据,并进行修改,但尚未提交到数据库;另一个事务也访问这条数据,然后进行操作,这个事务读取的是尚未更新的脏数据。
2.1,解决方法:
-
查看数据更新时在哪里更新的,如果是在代码里进行更新,如: money=money-1,没有在数据库进行更新的话,就可能不保持数据的原子性。所以说更新数据的操作是要在数据库的SQL语句中进行的。
-
如果还是不能解决的话要考虑在代码中运用事务和锁的机制进行解决,锁的机制可以让线程变成同步操作加sync关键字,或者是在方法上加上@Transction 的开启事务的方法,不过在数据库中默认是有事务开启的,而且要是在代码中进行事务锁机制的操作会影响数据库的操作性能的
网友评论