数据库行上的锁的范围(简单)

时间:2015-07-06 18:37:02

标签: java sql multithreading oracle

如果我在一个方法中锁定了一行,然后从同一个类中的另一个方法调用该方法,它会保留锁吗?

锁定行方法(作为预备语句):

    private const string SQL_CONNECTION = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

    private DataTable GetTable()
    {
        var table = new DataTable();
        using (var con = new System.Data.SqlClient.SqlConnection(SQL_CONNECTION))
        {
            con.Open();
            using (var cmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM MyTable;", con))
            {
                table.Load(cmd.ExecuteReader());
            }
        }
        return table;
    }

    private int SaveApproved(int rowID, bool approved)
    {
        using (var con = new System.Data.SqlClient.SqlConnection(SQL_CONNECTION))
        {
            con.Open();
            using (var cmd = new System.Data.SqlClient.SqlCommand("UPDATE MyTable SET IsApproved=@IsApproved WHERE ID=@ID;", con))
            {
                cmd.Parameters.Add("@IsApproved", SqlDbType.Bit).Value = approved;
                cmd.Parameters.Add("@ID", SqlDbType.Int).Value = rowID;
                return cmd.ExecuteNonQuery();
            }
        }
    }

此方法将选择那些并创建一个列表(或数组)。 然后,同一个类中的方法将调用锁定行方法以获取列表/数组并执行实际更新。

另请注意,我确实希望在同一个线程中使用两种不同的方法(它是并发的)。

那么,它是否保留了更新方法的锁定?

1 个答案:

答案 0 :(得分:4)

数据库锁与Java类或任何其他Java构造无关。它们与数据库事务相关联。在交易中完成的任何工作都将通过锁完成。锁定会阻止在不同交易中完成的任何工作。