1、脏读:一个事务读取到了另外一个事务没有提交的数据
事务1:更新一条数据
事务2:读取事务1更新的记录
事务1:调用commit进行提交
此时事务2读取到的数据是保存在数据库内存中的数据,称为脏读。
读到的数据为脏数据
详细解释:
脏读就是指:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,
另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个
事务读到的这个数据是脏数据,依据脏数据所做的 *** 作可能是不正确的。
2、不可重复读:在同一事务中,两次读取同一数据,得到内容不同
事务1:查询一条记录
事务2:更新事务1查询的记录
事务2:调用commit进行提交
事务1:再次查询上次的记录
此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读。
3、幻读:同一事务中,用同样的 *** 作读取两次,得到的记录数不相同
事务1:查询表中所有记录
事务2:插入一条记录
事务2:调用commit进行提交
事务1:再次查询表中所有记录
此时事务1两次查询到的记录是不一样的,称为幻读
SQL Server 2000支持每个实例32,767连接。您可以运行每个节点16个实例,所以每个服务器节点客户端连接的最大数目为524272。需要注意的是,除非你有SQL Server 2000企业版,你必须单独付费才能使用的每个16个实例的一台计算机上。
SQLite作为一款小型的嵌入式数据库,本身没有提供复杂的锁定机制,无法内部管理多路并发下的数据 *** 作同步问题,更谈不上优化,所以涉及到多路并发的情况,需要外部进行读写锁控制,否则SQLite会返回SQLITE_BUSY错误,以驳回相关请求。
返回SQLITE_BUSY主要有以下几种情况:
1。当有写 *** 作时,其他读 *** 作会被驳回
2。当有写 *** 作时,其他写 *** 作会被驳回
3。当开启事务时,在提交事务之前,其他写 *** 作会被驳回
4。当开启事务时,在提交事务之前,其他事务请求会被驳回
5。当有读 *** 作时,其他写 *** 作会被驳回
6。读 *** 作之间能够并发执行
基于以上讨论,可以看出这是一个典型的读者写者问题,读 *** 作要能够共享,写 *** 作要互斥,读写之间也要互斥
可以设计如下的方案解决并发 *** 作数据库被锁定的问题,同时保证读 *** 作能够保持最大并发
1。采用互斥锁控制数据库写 *** 作
2。只有拥有互斥锁的线程才能够 *** 作数据库
3。写 *** 作必须独立拥有互斥锁
4。读 *** 作必须能够共享互斥锁,即在第一次读取的时候获取互斥锁,最后一次读取的时候释放互斥锁
以上就是关于使用数据库连接池,怎么解决多个用户并发的向数据库中插入数据全部的内容,包括:使用数据库连接池,怎么解决多个用户并发的向数据库中插入数据、SQL Server 2000的并发连接数是多少、多线程如何并发访问SQLite数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)