日期:2014-05-18  浏览次数:20512 次

【百分紧急求救】关于事物的几个疑惑点,希望各位老师帮助.
一,对于一个Connection来说如果这个连接只用了select进行查询的话,那么我们用不用事务的效果是不是一样的,因为select只是进行查询操作,还是有其他的说法.

二,对于一个连接Connection来说如果同时进行select和update或insert的操作(比如从表A查出来数据的某几个列update到表B),那么当我们用事务控制的时候是需要两个Connection一个进行select(事务可选),一个进行update(要用事务),还是我们只需要一个Connection来用事务并进行select和update操作?

三,有一个表有100万条数据,一个应用程序用事务处理,update这100万条数据的某个字段,(我想在快的数据库也需要10s左右吧?)这个时候这个线程是不是需要创建一个锁?那么这个锁是独占锁(肯定不是共享锁吧),这个锁同时是表级锁还是行级锁?     好的   ,回答完了上面的问题紧接来了,     另外一个用户也登陆   同样的操作,update这个儿100万条数据,那么此时会发生什么,这个线程是会等待前一个结束之后在进行操作,还是同时进行(这个好像不可能吧),还是直接报错,或者是等待一段时间后报错?

四,一般锁的这种概念和错误在什么时候容易出现?应该如何解决呢,

非常感谢,一个新手,如果大家不满意会在开新帖加分的,因为级别很低,只能先给100分了。

------解决方案--------------------
HOHO!
不会
不过顶下
------解决方案--------------------
2.对于第二个问题
我们只需要一个Connection来用事务并进行select和update操作
------解决方案--------------------
事务控制的时候是需要两个Connection一个进行select(事务可选),一个进行update(要用事务)

事务只在一个Connection中,如果你断开连接前事务如果提交那么就自动回滚了
LZ应该是在一个Connection中开一个事务做select 和 update,在两个Connection中你的事务就是独立的没有联系的两个事务

update的时候如果where 条件是主键那么就是行锁,否则就是表锁,一个用户用事务update这个儿100万条数据,如果这时连接没有关或者提交,那么其他人是不能update的,只能等
------解决方案--------------------
如果你表有主键,那么update时就是行锁
您可以通过EXEC sp_lock @@spid做个测试
------解决方案--------------------
BEGIN TRAN

update...

EXEC sp_lock @@spid

ROLLBACK TRAN
------解决方案--------------------
三,有一个表有100万条数据,一个应用程序用事务处理,update这100万条数据的某个字段,(我想在快的数据库也需要10s左右吧?)这个时候这个线程是不是需要创建一个锁?那么这个锁是独占锁(肯定不是共享锁吧),这个锁同时是表级锁还是行级锁? 好的 ,回答完了上面的问题紧接来了, 另外一个用户也登陆 同样的操作,update这个儿100万条数据,那么此时会发生什么,这个线程是会等待前一个结束之后在进行操作,还是同时进行(这个好像不可能吧),还是直接报错,或者是等待一段时间后报错?

数据库中有数据隔离等级,不同的等级会有不同的结果。
可能会加锁,或者没有锁,而其他用户可以读取脏数据。
如果有锁的话,是等待。。。。。。还是等待。。。。 ^,^


------解决方案--------------------
1、效果是一样的。
2、只需要一个connection
3、默认不报错,但如果操作同条数据,仅成功一次
4、并发操作执行时发生。
------解决方案--------------------
upupupupupupupupupupupup
upupupupupupupupupupupup
upupupupupupupupupupupup
upupupupupupupupupupupup
upupupupupupupupupupupup